使用 Flask 实现微信公众号自动回复 Bot

人都是被逼出来的,业务突然来了的时候才能感到全速赶工的效率。这里记录一下如何用 10 分钟快速配置一个微信公众号自动回复机器人。 一些准备工作 首先需要关闭微信提供的自动回复功能,然后登录微信公众平台,前往开发者配置的基本配置。 URL :在这里输入你的接口地址,在下方的例子中,是 https://url/wechat。 Token:你可以自己输入 Token,用于验证。 EncodingAESKey:随机生成就好,同样用于验证。 消息加密方式:只要采用了 https 协议,明文模式也已经足够安全。为了便于开发调试我直接使用了明文方式。 快速让后端跑起来 需求很重要。没有必要在部署和非逻辑层上花费太多时间。下面是我使用的框架,在 get_reply(msg) 中写下你的业务逻辑就好。 对于比较复杂的项目,你可以考虑把一些方法拆分单独的文件中。 import hashlib from flask import * import xml.etree.ElementTree as ET app = Flask(__name__, static_url_path='/static') WECHAT_TOKEN = 'YOUR TOKEN' AES_KEY = 'YOUR AES KEY' def get_reply(msg): return 'You can write your own handler here.' def send(to_user, from_user, content): reply = """ <xml><ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag></xml> """ response = make_response(reply % (to_user, from_user, str(int(time....

May 4, 2020 · Bill Chen

使用 Python 自动登录华东师范大学数据库

近期经常需要写一些和华师大数据库交互的小工具,比如导出课程表,获取绩点等。这里提供使用 Python 登录数据库的方法,将登录信息使用 request 包记录在一个 request.session 中。 这里涉及到四个函数。 main():一个示例的交互逻辑 ECNULogin()主要的登录函数 GetCode()用于获取验证码。这里把手动输入的两行注释掉了,如果不想安装tenserflow,则可以注释掉下面的识别部分,手动输入验证码。不过华师大的验证码很好识别。目前我还没有遇到 pytesseract识别失败的情况。 GetRSA()RSA 加密登录信息。这里调用的是华师大数据库中的 js 文件,并使用execjs来调用内部的 strEnc 函数。 from PIL import Image # 手动输入验证码 import pytesseract # 自动识别验证码 from lxml import etree import sys import requests import getpass import execjs # 用于加密 # 记录登录信息的 session s = requests.session() mainurl = 'https://portal1.ecnu.edu.cn/cas/login?service=http%3A%2F%2Fapplicationnewjw.ecnu.edu.cn%2Feams%2Fhome.action' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36', 'Refer': 'https://portal1....

April 15, 2020 · Bill Chen

使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内

这几天在用 Python3 研究一个爬虫,最后一个需求是把爬下来的20+个csv文件整合到一个excel表里的不同sheets。 初版的核心代码如下: while year <= 2018: csvPath = sys.path[0] + '/result/%d.csv' % year excelPath = sys.path[0] + '/result.xlsx' csvReader = pandas.read\_csv(csvPath, encoding='utf\_8_sig') excelWriter = pandas.ExcelWriter(excelPath) print("正在将 %d年的 %d条数据转换为 xlsx..." % (year, countThis)) csvReader.to\_excel(excelWriter, sheet\_name=str(year)) year = year + 1 奇怪的是使用这个方法,每次to_excel之后,result.xlsx中都只会存储一年的数据,只会存在一个sheet,之前的所有数据都会被覆盖。 通过查询官方文档(pandas.DataFrame.to_excel)和一个github上跨越了5年的issue(Allow ExcelWriter() to add sheets to existing workbook)得知pandas库的ExcelWriter缺失了一个mode='a'的append模式,所以在这种情况下每次to_excel()都会直接新建一个文件写入而无视之前的数据。 解决方案是使用openpyxl engine来打开ExcelWriter,用openpyxl的load_workbook方法将之前已经存在的数据加载进ExcelWriter.book里。修改后的核心代码如下: # 依赖 openpyxl 库 from openpyxl import load_workbook while year <= 2018: csvPath = sys.path[0] + '/result/%d.csv' % year excelPath = sys....

April 11, 2019 · Bill Chen