老头是真的老了,都奔五的人了。
如今中年男人工作压力大,生活压力大,而公司的压力更大。在听了python让生活更美好的广告后,老头为了让晚上还能早点回家,咬牙省下了一个月的私房钱买了两本正版书,从此踏上了苦B的Python学习之旅。
好了,话不多说了,今天我们就聊聊如何让itchat支持代理的事吧。
事情是这样滴:
老头所在公司要每天把一些内网的报表数据扒拉下来,把业绩分个一二三等,在微信群里通报通报(自动扒拉报表的过程以后再表)。
因为每天各经营单位都是晚上6点半以后才差不多结束营业,因此老头只能在7点钟左右进行统计,唉,也只有我们这些有房有贷有家小的中年男人才能这样工作。等到导完数据,导入excel模板,统计完毕再发微信群,也差不多7点半了,在魔都,这个点下班回家,差不多得8点半才到家吃饭。
这样干了几个星期,实在有点吃不消了,虽然python是刚学的,才学了print(),也只有硬上了。
总之,经过了更苦B的几个星期的program自觉加班过程,老头终于成功的把报表处理及报告内容生成编成了程序,原来半个小时工作变成了2分钟,只要把报告内容copy到PC版微信里发出去就行了。
老头这样舒服了几天,没想到,各位看通报的80、90后吃瓜群众又提出了更高的要求,要求更美观,于是老头要先把报告通过PC版微信发给自己,然后再在微信上加上各种粉红色的emoji再发。老头人老眼花,发emoji实在累。就想着有木有办法直接让程序把报告内容给发了,于是爬遍各大网站,大家一致推荐itchat好用量又足。
老头满怀希望pip install itchat后,发现事情大条了:itchat居然不支持代理。
话说老头所在的公司,虽然业绩不如大公司,可对IT管理之严格可比肩业内老大,比如上网必须通过代理等等。
这可怎么办,老头在吃瓜群众中还是有点IT威望的,可不能因为这点事而弱了自己的名头。
反正公司内网环境访问外网都是必须要用代理的,那就把itchat的原码简单改改,研究了一下itchat的原码,原来它都是通过requests.session.get或requests.session.post的方法和weixin服务器连接的,这就好办了嘛,只要把session初始化时加入proxy支持就OK了。
说干就干。
第一步,先找到itchat安装的目录,找到config.py
一般内容是这样的:
```
import os, platform
VERSION = '1.3.10'
BASE_URL = 'https://login.weixin.qq.com'
OS = platform.system() # Windows, Linux, Darwin
DIR = os.getcwd()
DEFAULT_QR = 'QR.png'
TIMEOUT = (10, 60)
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
```
可以在里面加上一行:PROXIES = {'http':'http://公司代理IP地址:公司代理http端口号','https':'https://公司代理IP地址:公司代理https端口号'}
有人说proxy我只用http的行不,老头在这里遇到过坑,明白告诉你,不行,weixin都要用到https协议的。
第二步,找到core.py
找到
```
self.s = requests.Session()
```
在下面插入一行。
```
self.s.proxies.update(config.PROXIES)
```
第三步,找到utils.py
找到
```
def test_connect(retryTime=5):
```
把本段函数里的
```
r = requests.get(config.BASE_URL)
```
改成:
```
r = requests.get(config.BASE_URL,proxies = config.PROXIES)
```
第四步,找到components目录下的login.py
找到
```
def get_msg(self)
```
把本段函数里的
```
r = self.s.post(url, data=json.dumps(data), headers=headers, timeout=config.TIMEOUT)
```
改成
```
r = self.s.post(url, data=json.dumps(data), headers=headers, timeout=config.TIMEOUT,proxies = config.PROXIES)
```
然后运行主程序,一切正常,搞定收工。
第一次写,写得不好,请大家不吝打赏。