[速记] Python 使用网络代理

在测试 Telegram 机器人的时候遇到了网络问题(由于众所周知的原因,Telegram 的服务器在国内大部分地区无法访问),于是需要使用代理。我本机上是有一个运行在 1080 端口的 socks5 代理,那么速记一下如何使用。

urllib2

python-telegram-bot 是直接使用的 urllib2,所以我直接让 urllib2 全局使用代理。需要安装 PySocks

pip install PySocks
# 会安装 socks 和 sockshandler 两个模块

使用:

import socks
import urllib2
from sockshandler import SocksiPyHandler
opener = urllib2.build_opener(
    SocksiPyHandler(socks.SOCKS5, address, proxyport=proxyport, **kwargs)  # 额外参数
)
urllib2.install_opener(opener)

requests

让 requests 使用代理就简单多了。requests 本身支持 HTTP_PROXYHTTPS_PROXY 两个环境变量(通过 os.environ 获取)。按照官方说法,要使用全局代理的话也可以直接设置 ALL_PROXY 这个环境变量,不过我测试没有成功。

那么,要让 requests 全局使用代理的话,只要在调用前设置 os.environ['HTTP_PROXY']os.environ['HTTPS_PROXY'] 就可以了,格式是类似 protocol://user:passwd@address:port

更多代码实例可以参考 《Python:使用代理proxy爬虫》,但是注意一点:使用爬虫恶意抓取网站内容不仅是不道德行为,更有可能因违反站点的 ToS 而被封禁帐号/IP,甚至起诉。

设置树莓派使用外置硬盘启动

整件事情是这样的:某一天我尝试在树莓派上安装一个 vim 的编辑器插件 YouCompleteMe,需要从源码编译。编译这个比较耗费内存,可能我分配的 SWAP 不够大(1024MB),导致内存不足,然后 sshd 就挂了。嗯,并且已经过去了一个小时我也没法连接上去。于是我就拔电源重启了,这下可好,SD 卡彻底启动不了了,估计是文件系统损坏之类的。上网搜了一下这种现象似乎非常常见,只要在断电时 SD 卡还在写入就可能出现。于是我就想到要把系统装在外置硬盘上。

阅读剩余部分 -

12月近况

11月和12月似乎并没有什么重要的事情发生的样子。那么以下是并不重要的流水账。

  • 黑五 Steam 打折,趁机入手了几个之前玩过盗版的游戏.
  • 从 12月13日 起,本站开始使用 HTTP2 了(托管在别处的子域名除外)。
  • 之前因为网站迁移到了国内,所以 Telegram 机器人一直没去弄了(网络原因)。最近清理了一下之前的代码,没什么卯月的功能都去掉了,增加了一个消息推送功能,也是目前唯一的功能。
  • 买了一个诺基亚 5110 的 LCD 屏幕用在树莓派上,然而对比度太低,加上屏幕接触不良、液晶显示速度慢等等问题,现在已经不在使用中。
  • 买了一个 SSD1306 驱动的 OLED 单色屏幕,对比度高,SPI 接口速度还不错,使用中。
  • 买了本 Flask 的书(好久不买实体书了),希望能一边看一边做点实用的东西出来。
  • Mac 上有些应用突然打不开(可能是上次 MAS 证书过期问题导致的),这其中包括 Dash 2;然而 Dash 2 的 MAS 页面已经被替换成了 Dash 3,内购解锁完整版的价格是 163 软妹币。因为我之前通过 MAS 购买了 Dash 2 的原因,给作者发邮件后拿到了优惠码,现在已经换成 Dash 3 了。
  • DNSPod 在 12月18日 解决了Let's Encrypt 的支持问题,之后如果可行的话所有子域名都会强制开启 HTTPS。
  • 前段时间作息有点不太规律,近期计划调整好。
  • 好像很久没画画了,记得不要荒废了自己的数位板。
  • Google Analytics 拖慢页面加载速度,加上很多用户都会开启 Adblock,其实并没有什么卯月,打算年底前找个替代品。
  • Gravatar 拖慢页面加载速度,目前换成了 typcn 的镜像,先观察一段时间。

那么额外说明一下该如何启用 HTTP2 吧(Ubuntu 系统)。首先卸载已经安装的所有 nginx

然后导入 Nginx 官方签名的 key:

wget -c http://nginx.org/keys/nginx_signing.key
cat nginx_signing.key | sudo apt-key add -

其次,在 /etc/apt/source.list 中加入 Nginx 官方源:

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

其中 codename 替换成你自己所使用 Ubuntu 版本的代码名称。
接下来 apt-get update 更新一下软件包列表,然后重新安装 nginx

这时候 nginx 应已经是 1.9 以上的版本了。在配置文件中修改启用 HTTP2:

server {
    listen 443 http2;
    ssl on;
    ...
}

然后重启 nginx 就好了。

开启了之后感觉飞快的样子,页面打开时间比之前减少一半以上,不知道是不是我的错觉。

使用 Gogs 搭建自己的 Git 服务器

作为个人私有云的一环(虽然是搭建在公共服务器上),一直都很想搭建一个类似 GitHub 的服务,但 GitLab 太复杂了(说句不好听的,GL 就是 Git server 中的 WordPress),别的又相当简陋,于是一直以来都只有围观的份。最近发现上半年关注的 Gogs 经过几个版本迭代,已经达到基本可用的状态了。于是搭建了一个自己的服务,用来镜像自己分散在各个服务商处的代码,以及开新坑的时候托管用。这里把安装的过程和一些需要注意的地方记录一下。

阅读剩余部分 -

使用树莓派自动记录一天的家庭影像

嗯,这篇也是因为一些事情拖得比较久,到今天(2015年9月6日)才开始写。

上次说到我大幅修改了 Telegram 机器人的架构。期间发现一件事情,因为这个机器人与树莓派交互,有时候需要调用摄像头,还有时候需要调用 GPIO 设备(传感器之类)。而这部分代码重复非常多,基本上每个需要用到的项目都是手动复制一遍,看起来很不爽,也对其他部分的代码构成很大影响。

于是我就想到要把树莓派上的部分硬件以服务的方式暴露出来(当然因为安全原因只能暴露给树莓派本机),方便外部程序调用。甚至更极端一点,把整个树莓派作为一个服务,当然这个目前还没什么用处。

于是就有了 JokerQyou/pitools 这个东西,是一个在树莓派上运行的 Tornado 服务器,与硬件进行交互,将它们作为 Web 服务暴露给本地网络(lo)。这样外部程序就可以直接通过 HTTP 请求调用硬件了。

目前有两个功能,一个是 Adfruit 的温度/气压传感器调用,一个是摄像头调用。温度传感器返回的是 JSON,摄像头调用后返回照片的路径。总之代码超级简单。更多的功能之后再添加咯。

那么现在肯定有读者要问了,你哔哔这么一大堆,跟标题有什么琴梨关系?

当然有关系。这个服务中有一个接口不是每次调用都会成功,而是在调用间隔大于 50 秒时才会成功。这个接口被设计来用于实现定时拍照,它会将照片保存在以日期为名字的文件夹中,并且在每天 0 点之后的第一次调用中,把前一天的图片编码转换为一段视频。只需要运行服务,然后设置一个 cron 任务,每分钟触发一次这个接口就可以了。

当然这个工具目前还有很多改进的空间。

使用 Telegram 与树莓派进行交互(一)

其实这篇文章前半部分在 7 月 5 号就写了,但是写着写着就没了灵感(讲真,就像突然被人灌了硫酸铜变哑巴了),于是一直拖到现在(7 月 13 号)。
更正:因为住处装修的关系,这篇文章一直拖到 7 月 24 号才发布。

嗯,久违地看一下博客后台,果然上一次写文章又是近一个月前,我这博客都快写成月报了 (´・_・`)
上次文章里说到我入手了一块 KBT Race 2 青轴键盘,我打算另起一篇文章详细地讲讲这件事,关于这个无良卖家,我要好好地批判一番。

阅读剩余部分 -

6 月近况

一转眼又很久没更新博客了,这地方还真是快长草了。那么简单说一下最近的一些事情吧。

先是 4 月底的时候感染了水痘。对的,没错,我一个大好青年居然这个年龄感染了水痘,然后在家休息了差不多半个月。
前一周基本都是在去医院拿药 → 回家吃药 → 昏睡中度过的,而且出去拿外卖或是去医院拿药还要带着口罩躲着人群,生怕传染给别人。而且广州是很热的,于是电费开始爆炸……

阅读剩余部分 -