惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
F
Fortinet All Blogs
爱范儿
爱范儿
博客园 - Franky
MyScale Blog
MyScale Blog
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
P
Proofpoint News Feed
IT之家
IT之家
宝玉的分享
宝玉的分享
D
DataBreaches.Net
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
M
MIT News - Artificial intelligence
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
量子位
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

Dr34m's Blog

I Expect You To Die(我希望你死) 1,2,3 完整中文攻略 Linux换国内源 && docker安装 && 换加速镜像 Vue3 + Element-Plus 极简速查 随笔 pyinstaller打包的程序执行报错Failed to extract xxxx decompression resulted in return code -1 taoSync排除项简易教程 apscheduler的cron配置项 如何在绿联NAS中使用TaoSync同步我的文件到各个网盘 GB28181抓包记录 JS计算字节大小,把字节转换为KB/MB/GB/TB等 在Python中使用onvif管理摄像头,包括设备发现,获取RTSP地址,获取设备信息,截图,云台控制与缩放,设置时间 编写bat脚本实现对vue项目构建并压缩 内网穿透工具frp快速使用 CentOS 7.9 安装基础开发环境jdk redis nacos nginx mysql Pyinstaller 逆向 VUE实现复制与粘贴_获取剪切板内容 Electron + xterm.js + node-pty + vue 实现本地终端 child_process exec 中文乱码 Windows&Linux 解决方法 yum 更新 gcc CentOS安装并使用conda 将fluid主题博客的静态资源由第三方改为本地存储 一个上手即用的通用公众号/小程序/h5/app框架 python批量转化doc到docx SpringBoot单元测试注入空指针 TensorFlow 预测出现NaN的一种可能以及解决方法 随笔 python归一化数据 windows下python安装sasl遇到的问题及解决 将对象List中的某个字段放到新的List中[转载] Python http.server 本地服务支持跨域
python实现微信jsapi签名
Dr3@m · 2021-06-24 · via Dr34m's Blog
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import redis
import requests
import json
import hashlib
import time
import random
import string

from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop

# 公众号id与秘钥
appId = 'xxx'
appSecret = 'xxx'

# 缓存的access_token与ticket在redis中的key
ack = 'test_access_token'
tik = 'test_ticket'

# redis主机和密码
redisHost = 'xxx'
redisPassword = 'xxx'

r = redis.Redis(host=redisHost, port=6379, password=redisPassword, decode_responses=True)

def getTicket():
if r.get(tik) is None:
if r.get(ack) is None:
params_ack = {'grant_type': 'client_credential', 'appid': appId, 'secret': appSecret}
access_token_data = requests.get('https://api.weixin.qq.com/cgi-bin/token', params=params_ack).text
access_token = json.loads(access_token_data)['access_token']
r.set(ack, access_token, ex=7100)
else:
access_token = r.get(ack)
params_tik = {'access_token': access_token, 'type': 'jsapi'}
ticket_data = requests.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket', params_tik).text
ticket = json.loads(ticket_data)['ticket']
r.set(tik, ticket, ex=7100)
else:
ticket = r.get(tik)
return ticket

def getSignature(url):
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
timestamp = int(time.time())
params = {'noncestr': ran_str, 'jsapi_ticket': getTicket(), 'timestamp': timestamp, 'url': url}
stringA = ''
# 参数排序与拼接
ks = sorted(params.keys())
for k in ks:
stringA += k + "=" + str(params[k]) + "&"
stringSignTemp = stringA[:-1]

# sha1
hash_sha1 = hashlib.sha1(stringSignTemp.encode('utf8'))
result_string = {
'debug': True,
'appId': appId,
'timestamp': timestamp,
'nonceStr': ran_str,
'signature': hash_sha1.hexdigest(),
'jsApiList': ['updateAppMessageShareData', 'updateTimelineShareData']
}
return json.dumps(result_string)

class getResult(RequestHandler):
def get(self):
url = self.get_argument('url')
self.write(getSignature(url))

if __name__ == "__main__":

app = Application([(r"/getApi", getResult)])

port = 8060

app.listen(port)

print("\n\n=============================================================")
print(" (♥◠‿◠)ノ゙ server run success at: http://0.0.0.0:%s ლ(´ڡ`ლ)゙" % str(port))
print("=============================================================\n\n")

IOLoop.current().start()