废话不多说,直接贴代码,有兴趣的访问我的 github。
#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def sendsms(phone, param_string, access_key_id, access_key_secret, template_code, sign_name):
from datetime import datetime
import uuid
import requests
url = 'https://sms.aliyuncs.com/'
ts = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
once = str(uuid.uuid4())
data = {
'Action': 'SingleSendSms',
'SignName': sign_name,
'TemplateCode': template_code,
'RecNum': phone,
'ParamString': param_string,
'Format': 'JSON',
'Version': '2016-09-27',
'AccessKeyId': access_key_id,
'SignatureMethod': 'HMAC-SHA1',
'Timestamp': ts,
'SignatureVersion': '1.0',
'SignatureNonce': once,
}
def __percent_encode(s):
import urllib
s = str(s)
s = urllib.quote(s.decode('utf8').encode('utf8'), '')
s = s.replace('+', '%20')
s = s.replace('*', '%2A')
s = s.replace('%7E', '~')
return s
def __gen_signature(data, req_method, secret):
import hashlib
import hmac
import base64
sorted_data = sorted(data, key=lambda v: v[0])
vals = []
for k, v in sorted_data:
vals.append(__percent_encode(k) + '=' + __percent_encode(v))
params = '&'.join(vals)
string_to_sign = req_method + '&%2F&' + __percent_encode(params)
key = secret + '&'
signature = base64.encodestring(hmac.new(key, string_to_sign, hashlib.sha1).digest()).strip()
return signature
try:
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
signature = __gen_signature(data.items(), 'POST', access_key_secret)
data['Signature'] = signature
r = requests.post(url, data=data, headers=headers)
print r.text
except Exception, e:
print 'EXCEPT:', e
if __name__ == '__main__':
pass
最后想说的是,阿里云文档中关于 base64 后的签名值还需要做一次 URLEncode 编码的说法是有问题的,事实证明只会报错:Specified signature is not matched with our calculation.
,掉这坑里差点没爬上来。
MiLog 发布一年多了,昨天才第一次真正有动力实现插件系统——总觉得用一个异步的外部脚本做 anti-spam,不怎么得劲,还是写一个插件系统比较靠谱,本来插件系统也是 MiLog 的规划功能之一,更重要的是:
- 简单的非核心功能并不想用 Go 写进 MiLog 里,最好只保持一个轻量级的 Core;
- 最好可以用 Python 写插件,没别的原因,我喜欢 Python 就足够了;
于是乎,MiLog Plugins System 诞生了,目前只支持用 Python 编写插件,最简单的插件只需要两个函数(参考 speak-chinese-please):
register()
用于 MiLog 加载插件时注册事件;
<事件名>()
用于处理事件回调;
将编写好的插件放在任意目录下,并在 conf/app.conf
中增加一行,指向该目录就行:
plugindir = <path_to_plugin_directory>
哦对了,做完以上步骤后 MiLog 需要重启,注意通过日志观察插件是否注册成功。
Now, enjoy!
最近一段时间本 blog 被个别 spammer 盯上了,成功绕过验证码狂发垃圾广告,本来打算抽空做个简单的朴素贝叶斯做反垃圾,无奈本人实在太懒,迟迟没有动手,倒是收集了不少内容做样本……
考虑到这些 spam 内容无一例外都是英文,暂时先写个检测中文的脚本顶一阵吧,于是在几分钟前,speak-chinese-please 上线了——我太懒,简单脚本管用绝不写复杂的,顺便观察下 spammer 学习能力如何,10 年前玩 WordPress 的时候已经有机器人可以随机输入中文绕过该机制了,就看这次它会不会了。
分享一个 python 检测中文字符的函数吧,这也是 speak-chinese-please 的核心:
def any_chinese(s):
return any(u'\u4e00' <= c <= u'\u9fff' for c in s.decode('utf-8'))
嗯,就一行,注意 any()
函数。
升级所有包
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs pip install -U
via
配置国内源(阿里云)
Mac & Linux
修改 ~/.pip/pip.conf
文件(Mac & Linux 系统)或 %HOMEPATH%\pip\pip.ini
(Windows 系统),如果不存在就新建一个,把下面的内容粘进去:
[global]
trusted-host=mirrors.aliyun.com
index-url=http://mirrors.aliyun.com/pypi/simple
今天刚入手树莓派 3,有种相见恨晚的感觉,接下来又有得折腾了。
ZHETENG #1: 动态 DNS
我相信虽然树莓派足够轻便,但你也不会愿意总把它带在身边,应该还是需要固定在某个地方提供服务的,比如藏在家里的电视柜里——你要拿它做一个机器人或者无人机之类,当我没说,而且这篇文也没必要往下看了,这里仅针对拿树莓派当 Linux 远程主机使用的场景 ;-)
如果家里的宽带没有固定公网 IP,不在家的时候怎么访问就很成问题。过去我在西数 MyBookLive 上的做法是,每天中午 12 点,crontab 执行脚本获取外网 IP,email 给我。low 是 low 了点,但基本上能满足需求,主要考虑 MyBookLive 频繁唤醒几 T 的大硬盘会缩短寿命,所以把脚本执行的周期设得比较长。
现在有了树莓派,没有挂硬盘,只插了个 32G 的 TF 卡,可以随便搞了,最优的方案当然是动态域名解析。于是在 DNSPod 注册了账号,把域名的 nameserver 设置到 DNSPod,再用 python 写了个脚本专门干这个事,代码放在 github 上了,把文档贴一下:
dnspod.py
@author migege
@version 0.0.2
dnspod.py 是基于 DNSPod 服务的动态 DNS 脚本,用于检测 IP 变化并更新至 DNSPod,支持多域名解析。支持 Linux 设备,包括树莓派(Raspberry Pi)。
Prerequisites
- python
- pyyaml
- requests
python 的模块可通过 pip install
命令安装。如果未安装 pip,请先安装 pip。
Installation
安装 git 客户端,通过本命令获取 dnspod.py
git clone https://github.com/migege/dnspod.git dnspod
然后到 dnspod 目录下新建 conf.yaml
文件,根据您的 DNSPod 设置,填入以下内容:
token: <your_api_token>
sub_domains:
<your_first_sub_domain_name>:
domain_id: <your_domain_id>
record_id: <your_record_id>
<your_second_sub_domain_name>:
domain_id: <your_domain_id>
record_id: <your_record_id>
最后设置 crontab 定时任务
*/10 * * * * cd <path_to_dnspod>; /usr/bin/python dnspod.py conf.yaml > /dev/null 2>&1 &
Tips
- */10 表示每 10 分钟执行一次 dnspod.py
- 如果 python 可执行路径不是 /usr/bin/python,请自行替换