python 实战:模拟 post 请求定时获取后台数据并打包发送至微信

警告
本文最后更新于 2023-07-07,文中内容可能已过时。

用 python 模拟 post 请求获取“麻小科技”示例酒店后台的数据,再打包发送至指定的微信群或者好友。
要求每天早上 8 点定时把每个酒店的数据发送至每个酒店的微信工作群。

背景

麻小科技:
麻小科技全名深圳市麻小科技有限公司,成立于 2017 年 1 月。是我高一的时候参加Peer 夏令营带我们一个玩的“老师”和他的朋友的创业公司,说老师有点奇怪,我们都是直接叫名字的,比如大家都叫我瑞豪,我也就叫他文捷哥,简称捷哥吧。他们公司主要的开发模式是,小程序前端+php 后端,然后做的是酒店小程序,为每个酒店定制小程序。这些小程序可以贴在客房中给访客提供一些服务,大大节省了成本也提高了效率。
然后每个酒店小程序都有独立的后台,后台会记录一些点击需求的数据。现在他们有一个需求需要把每个酒店小程序后台的数据在每天早上 9 点发送至对应酒店的微信群。

实现代码

缓存登录信息,短时间类无需重复登录,仅第一次需要扫码登录(相当于微信网页版),后面的登录只需在手机上确认登录信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/python
import requests
import json
import time
from wxpy import *

## 基本信息填写:
## 酒店 id,酒店名称及群名列表数据,格式:["xxx","xxx","xxx"]
## 使用时请将以下三个列表一一对应
hotel=["xxxx","xxxx"] ## 酒店后台数据接口二级域名,已匿名
hotel_name=["增城宾馆","百丽酒店"]
grouplist = ["麻小","富强民主文明和谐自由平等公正法治"]

## post 请求发送的数据
postData = {
    ## 'username':'test',
    ## 'password':'123456',
}

def get_data():
	result = [] #结果列表
	i = 0 #计数器
	for each in hotel:
		url="http://"+each+".maxiaokeji.com/xxx/xxxxxxx/xxx" ## 为保护隐私及权益,这里不提供接口
		r = requests.post(url,data=postData)
		## print(r.text)

		## 把结果转化为 json 字符串
		response=json.dumps(r.json(),indent=4,ensure_ascii=False) #sort_keys=True

		## 把 json 转换为 dict 字典作为中间结果,再取出昨日数据
		midresult=json.loads(response)
		result.append("早上好!"+hotel_name[i]+"小程序昨日数据如下:\n 访问数:"+str(midresult["data"]["yesterday_data"]["type1"])+"\n 房间数:"+str(midresult["data"]["yesterday_data"]["type2"])+"\n 需求量:"+str(midresult["data"]["yesterday_data"]["type3"])+"\n 商品点击量:"+str(midresult["data"]["yesterday_data"]["type4"]))
		i+=1
	## print(result)
	return result

def wechat_send(bot,result):
	## my_friend = bot.friends().search('lrh')[0]
	## my_friend.send(result)
	i = 0 ## 计数器
	for group in grouplist:
		my_group = bot.groups().search(group)[0] #依次搜索每一个群名称,每次一个
		my_group.send(result[i])
		print(result[i])
		print("已发送至群:"+group)
		i+=1

def main(bot):
	## 设置最大休眠时间,防止程序长时间占用系统资源
	while True:
		now_hour = time.strftime("%H", time.localtime())
		now_min = time.strftime("%M", time.localtime())
		## 设置每天 8 点发送
		if now_hour < "08":
			rest = 8 - int(now_hour)
			sleeptime = (rest-1)*3600 + (60-int(now_min))*60
			print("启动时北京时间为:"+time.strftime("%H:%M", time.localtime()),"\t 软件将在",rest-1,"小时",int((sleeptime-(rest-1)*3600)/60),"分钟后发送数据")
			time.sleep(sleeptime)
		elif now_hour > "08":
			rest = 8 - int(now_hour) + 24
			sleeptime = (rest-1)*3600 + (60-int(now_min))*60
			print("启动时北京时间为:"+time.strftime("%H:%M", time.localtime()),"\t 软件将在",rest-1,"小时",int((sleeptime-(rest-1)*3600)/60),"分钟后发送数据")
			time.sleep(sleeptime)
		elif now_hour == "08":
			print("软件明天开始将在每天 8 点发送数据!")
			result=get_data() ## 获取数据
			wechat_send(bot,result) ## 发送数据
			time.sleep(86400-int(now_min)*60)

if __name__=="__main__":
	bot = Bot(cache_path=True) ## 初始化机器人,扫码登陆
	main(bot);

测试结果

程序打包

使用 pyinstaller 工具打包成可执行文件即可。(可执行文件不可跨平台运行,分平台打包)

目前该程序已经上线测试中 … 暂未反馈问题

收获

第一次参与实际公司的项目开发,虽然只是一个小的需求设计,但是我在这个过程中也学到了很多,比如通过实际一两周的编程对 Python 的熟悉度远远好过以前在实验室看的一个月视频。
还有就是在此次开发中,也感受到了实际项目开发的团队合作重要性,刚开始拿到这个需求,由于我对 python 和后台,以及数据接口这些基本的操作都不懂,就拿数据获取来说,我一开始一位要自己模拟登陆后台(已知密码),一顿操作、百度等等失败告终,后来涛哥给了一个数据接口,加上涛哥耐心指点,我才终于拿到了数据。
还有在多人合作的项目中,为保持代码的可读性,要尽量的多些注释,还有函数方法的命名尽量具备可读性。比如我代码中的wechat_send(),一开始的命名是wxfs(),经捷哥指正我才改过来的。

Buy me a coffee~
支付宝
微信
0%