diff --git a/10.GO-CQHTTP下载和运行.assets/image-20240616201445228.png b/10.GO-CQHTTP下载和运行.assets/image-20240616201445228.png
new file mode 100644
index 0000000..f5a4d57
Binary files /dev/null and b/10.GO-CQHTTP下载和运行.assets/image-20240616201445228.png differ
diff --git a/10.GO-CQHTTP下载和运行.assets/image-20240616201653395.png b/10.GO-CQHTTP下载和运行.assets/image-20240616201653395.png
new file mode 100644
index 0000000..8237564
Binary files /dev/null and b/10.GO-CQHTTP下载和运行.assets/image-20240616201653395.png differ
diff --git a/10.GO-CQHTTP下载和运行.assets/image-20240616201704561.png b/10.GO-CQHTTP下载和运行.assets/image-20240616201704561.png
new file mode 100644
index 0000000..90601e3
Binary files /dev/null and b/10.GO-CQHTTP下载和运行.assets/image-20240616201704561.png differ
diff --git a/10.GO-CQHTTP下载和运行.assets/image-20240616201755762.png b/10.GO-CQHTTP下载和运行.assets/image-20240616201755762.png
new file mode 100644
index 0000000..d214167
Binary files /dev/null and b/10.GO-CQHTTP下载和运行.assets/image-20240616201755762.png differ
diff --git a/10.GO-CQHTTP下载和运行.md b/10.GO-CQHTTP下载和运行.md
new file mode 100644
index 0000000..484c78a
--- /dev/null
+++ b/10.GO-CQHTTP下载和运行.md
@@ -0,0 +1,24 @@
+下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https://github.com/Mrs4s/go-cqhttp/releases)
+
+![image-20240616201445228](./10.GO-CQHTTP下载和运行.assets/image-20240616201445228.png)
+
+选择适合自己系统的版本。windows的版本在最下面的,打开这个页面如果没有显示windows,那就是被折叠了。你点击“more……”就有了
+
+
+
+双击`go-cqhttp_windows_386.exe`生成bat文件,在当前目录下cmd运行bat文件
+
+![image-20240616201653395](./10.GO-CQHTTP下载和运行.assets/image-20240616201653395.png)
+
+弹出一个黑窗口
+
+![image-20240616201704561](./10.GO-CQHTTP下载和运行.assets/image-20240616201704561.png)
+
+如果你不是很懂,需求不复杂,建议使用HTTP通信,开发起来更简单。(输入0就行)
+
+![image-20240616201755762](./10.GO-CQHTTP下载和运行.assets/image-20240616201755762.png)
+
+输入你需要的序号,按下回车,就会生成配置文件
+
+
+
diff --git a/11.签名服务器下载与搭建.assets/image-20240616202546716.png b/11.签名服务器下载与搭建.assets/image-20240616202546716.png
new file mode 100644
index 0000000..b066771
Binary files /dev/null and b/11.签名服务器下载与搭建.assets/image-20240616202546716.png differ
diff --git a/11.签名服务器下载与搭建.md b/11.签名服务器下载与搭建.md
new file mode 100644
index 0000000..2163184
--- /dev/null
+++ b/11.签名服务器下载与搭建.md
@@ -0,0 +1,15 @@
+下载(windows):https://github.com/CikeyQi/unidbg-fetch-qsign-gui
+
+下载(Linux):https://github.com/CikeyQi/unidbg-fetch-qsign-shell
+
+注意,官方原版已经停止维护,上述链接的不是原版。
+
+注意,该行为可能会导致QQ被封号,谨慎使用
+
+加载之后解压,以管理员身份运行EXE
+
+![image-20240616202546716](./11.签名服务器下载与搭建.assets/image-20240616202546716.png)
+
+添加一个启动列表,端口不要和其他程序冲突了。
+
+添加后右击启动
diff --git a/12.QQ信息配置与登录.assets/image-20240616202842810.png b/12.QQ信息配置与登录.assets/image-20240616202842810.png
new file mode 100644
index 0000000..0e79478
Binary files /dev/null and b/12.QQ信息配置与登录.assets/image-20240616202842810.png differ
diff --git a/12.QQ信息配置与登录.assets/image-20240616203000090.png b/12.QQ信息配置与登录.assets/image-20240616203000090.png
new file mode 100644
index 0000000..c8a4518
Binary files /dev/null and b/12.QQ信息配置与登录.assets/image-20240616203000090.png differ
diff --git a/12.QQ信息配置与登录.assets/image-20240616203513219.png b/12.QQ信息配置与登录.assets/image-20240616203513219.png
new file mode 100644
index 0000000..1a4585b
Binary files /dev/null and b/12.QQ信息配置与登录.assets/image-20240616203513219.png differ
diff --git a/12.QQ信息配置与登录.assets/image-20240616203811438.png b/12.QQ信息配置与登录.assets/image-20240616203811438.png
new file mode 100644
index 0000000..56e354a
Binary files /dev/null and b/12.QQ信息配置与登录.assets/image-20240616203811438.png differ
diff --git a/12.QQ信息配置与登录.assets/image-20240616204239564.png b/12.QQ信息配置与登录.assets/image-20240616204239564.png
new file mode 100644
index 0000000..0abf39c
Binary files /dev/null and b/12.QQ信息配置与登录.assets/image-20240616204239564.png differ
diff --git a/12.QQ信息配置与登录.md b/12.QQ信息配置与登录.md
new file mode 100644
index 0000000..b09b6b2
--- /dev/null
+++ b/12.QQ信息配置与登录.md
@@ -0,0 +1,26 @@
+编辑config.yml文件,输入账号密码,配置签名服务器和密码
+
+![image-20240616202842810](./12.QQ信息配置与登录.assets/image-20240616202842810.png)
+
+其他配置你自己看着来,都写了中文注释的,不懂的多百度。保存配置文件,运行bat
+
+![image-20240616203000090](./12.QQ信息配置与登录.assets/image-20240616203000090.png)
+
+自动提交可能会出问题,建议手动提交
+
+将链接粘贴到谷歌浏览器,打开(检查-Network),验证人机验证码,然后就可以看到ticket了
+
+![image-20240616203513219](./12.QQ信息配置与登录.assets/image-20240616203513219.png)
+
+将ticket粘贴回去,按回车。
+
+![image-20240616203811438](./12.QQ信息配置与登录.assets/image-20240616203811438.png)
+
+如果因为签名服务器的问题,请更换其他签名服务器。
+
+如果搞不来抓ticket就不要在配置文件中写密码,留空
+
+![image-20240616204239564](./12.QQ信息配置与登录.assets/image-20240616204239564.png)
+
+我在服务器中使用docker安装了这个
+
diff --git a/README.md b/README.md
index e304493..ab789e4 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
# Bot-CQBOT
-机器人:基于CQ-HTTP的QQ机器人
\ No newline at end of file
+机器人:基于CQ-HTTP的QQ机器人
+
+注意:由于现在(2024年7月)只要一登录QQ机器人,很快就会封号,风险太大,我已经不再维护该项目。
+
+各位同志也另谋出路,不要使用这种办法了
\ No newline at end of file
diff --git a/config.yml b/config.yml
new file mode 100644
index 0000000..d5a4fd9
--- /dev/null
+++ b/config.yml
@@ -0,0 +1,111 @@
+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+ uin: 3447902411 # QQ账号
+ password: '' # 密码为空时使用扫码登录
+ encrypt: false # 是否开启密码加密
+ status: 11 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+ relogin: # 重连设置
+ delay: 3 # 首次重连延迟, 单位秒
+ interval: 3 # 重连间隔
+ max-times: 0 # 最大重连次数, 0为无限制
+
+ # 是否使用服务器下发的新地址进行重连
+ # 注意, 此设置可能导致在海外服务器上连接情况更差
+ use-sso-address: true
+ # 是否允许发送临时会话消息
+ allow-temp-session: false
+
+heartbeat:
+ # 心跳频率, 单位秒
+ # -1 为关闭心跳
+ interval: 5
+
+message:
+ # 上报数据类型
+ # 可选: string,array
+ post-format: string
+ # 是否忽略无效的CQ码, 如果为假将原样发送
+ ignore-invalid-cqcode: false
+ # 是否强制分片发送消息
+ # 分片发送将会带来更快的速度
+ # 但是兼容性会有些问题
+ force-fragment: false
+ # 是否将url分片发送
+ fix-url: false
+ # 下载图片等请求网络代理
+ proxy-rewrite: ''
+ # 是否上报自身消息
+ report-self-message: false
+ # 移除服务端的Reply附带的At
+ remove-reply-at: false
+ # 为Reply附加更多信息
+ extra-reply-data: false
+ # 跳过 Mime 扫描, 忽略错误数据
+ skip-mime-scan: false
+
+output:
+ # 日志等级 trace,debug,info,warn,error
+ log-level: warn
+ # 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留.
+ log-aging: 15
+ # 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写
+ log-force-new: true
+ # 是否启用日志颜色
+ log-colorful: true
+ # 是否启用 DEBUG
+ debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+ # 访问密钥, 强烈推荐在公网的服务器设置
+ access-token: ''
+ # 事件过滤器文件目录
+ filter: ''
+ # API限速设置
+ # 该设置为全局生效
+ # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+ # 目前该限速设置为令牌桶算法, 请参考:
+ # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+ rate-limit:
+ enabled: false # 是否启用限速
+ frequency: 1 # 令牌回复频率, 单位秒
+ bucket: 1 # 令牌桶大小
+
+database: # 数据库相关设置
+ leveldb:
+ # 是否启用内置leveldb数据库
+ # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+ # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+ enable: true
+
+ # 媒体文件缓存, 删除此项则使用缓存文件(旧版行为)
+ cache:
+ image: data/image.db_robot
+ video: data/video.db_robot
+
+# 连接服务列表
+servers:
+ # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+ #- http: # http 通信
+ #- ws: # 正向 Websocket
+ #- ws-reverse: # 反向 Websocket
+ #- pprof: #性能分析服务器
+
+ - http: # HTTP 通信设置
+ address: 0.0.0.0:5700 # HTTP监听地址
+ timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
+ long-polling: # 长轮询拓展
+ enabled: false # 是否开启
+ max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
+ middlewares:
+ <<: *default # 引用默认中间件
+ post: # 反向HTTP POST地址列表
+ - url: 'http://127.0.0.1:4992/' # 地址
+ # secret: '' # 密钥
+ # max-retries: 3 # 最大重试,0 时禁用
+ # retries-interval: 1500 # 重试时间,单位毫秒,0 时立即
+ #- url: http://127.0.0.1:5701/ # 地址
+ # secret: '' # 密钥
+ # max-retries: 10 # 最大重试,0 时禁用
+ # retries-interval: 1000 # 重试时间,单位毫秒,0 时立即
diff --git a/device.json b/device.json
new file mode 100644
index 0000000..1d6a137
--- /dev/null
+++ b/device.json
@@ -0,0 +1,37 @@
+{
+ "display": "MIRAI.465058.001",
+ "product": "mirai",
+ "device": "mirai",
+ "board": "mirai",
+ "model": "mirai",
+ "finger_print": "mamoe/mirai/mirai:10/MIRAI.200122.001/0693789:user/release-keys",
+ "boot_id": "1eccb305-42eb-d6d7-58de-16d349a8b4cc",
+ "proc_version": "Linux version 3.0.31-uHLJgR8b (android-build@xxx.xxx.xxx.xxx.com)",
+ "protocol": 5,
+ "imei": "368556370277146",
+ "brand": "mamoe",
+ "bootloader": "unknown",
+ "base_band": "",
+ "version": {
+ "incremental": "5891938",
+ "release": "10",
+ "codename": "REL",
+ "sdk": 29
+ },
+ "sim_info": "T-Mobile",
+ "os_type": "android",
+ "mac_address": "00:50:56:C0:00:08",
+ "ip_address": [
+ 10,
+ 0,
+ 1,
+ 3
+ ],
+ "wifi_bssid": "00:50:56:C0:00:08",
+ "wifi_ssid": "\u003cunknown ssid\u003e",
+ "imsi_md5": "0d0dafd5ff8ed9f8700356af9f87e28c",
+ "android_id": "8a04000812fa08a9",
+ "apn": "wifi",
+ "vendor_name": "MIUI",
+ "vendor_os_name": "mirai"
+}
\ No newline at end of file
diff --git a/go-cqhttp.bat b/go-cqhttp.bat
new file mode 100644
index 0000000..ad456f6
--- /dev/null
+++ b/go-cqhttp.bat
@@ -0,0 +1,2 @@
+%Created by go-cqhttp. DO NOT EDIT ME!%
+start cmd /K "go-cqhttp_windows_386.exe"
\ No newline at end of file
diff --git a/go-cqhttp_windows_386.exe b/go-cqhttp_windows_386.exe
new file mode 100644
index 0000000..0e4e4f6
Binary files /dev/null and b/go-cqhttp_windows_386.exe differ
diff --git a/python-apiproject/.idea/.gitignore b/python-apiproject/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/python-apiproject/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/python-apiproject/.idea/API.iml b/python-apiproject/.idea/API.iml
new file mode 100644
index 0000000..a5010b8
--- /dev/null
+++ b/python-apiproject/.idea/API.iml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/.idea/inspectionProfiles/Project_Default.xml b/python-apiproject/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..5817152
--- /dev/null
+++ b/python-apiproject/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/.idea/inspectionProfiles/profiles_settings.xml b/python-apiproject/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/python-apiproject/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/.idea/misc.xml b/python-apiproject/.idea/misc.xml
new file mode 100644
index 0000000..ef5ee56
--- /dev/null
+++ b/python-apiproject/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/.idea/modules.xml b/python-apiproject/.idea/modules.xml
new file mode 100644
index 0000000..0ffd292
--- /dev/null
+++ b/python-apiproject/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/.idea/vcs.xml b/python-apiproject/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/python-apiproject/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/NOTAPI/get_user_tel_address/index.py b/python-apiproject/NOTAPI/get_user_tel_address/index.py
new file mode 100644
index 0000000..1fab0cb
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_address/index.py
@@ -0,0 +1,60 @@
+import json
+import time
+from multiprocessing.dummy import Pool
+import pymongo
+import requests
+import pandas as pd
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+
+def getUserTelAddress(tel):
+ api_url = r'https://cx.shouji.360.cn/phonearea.php?number='
+
+ print("开始查询",tel)
+ ret = requests.request(method="POST",url=api_url+str(tel))
+ result = ret.content.decode("utf-8").encode("utf-8").decode('unicode_escape')
+ print(result)
+ return json.loads(result)
+
+
+def loadData():
+ # 将这一千条数据添加到Mongodb
+ url = r"綦江校区2K.xlsx"
+ name = pd.read_excel(url,sheet_name="Sheet1",header=0)["姓名"]
+ tel= pd.read_excel(url, sheet_name="Sheet1", header=0,dtype={'电话':str})["电话"]
+ # 从MongoDB读取数据
+ jsq = 0
+ for i in range(0,len(name)):
+ DataYuan.insert_one({"姓名":name[i],"电话":str(tel[i])})
+
+# 2020条数据
+def getinfo(tel):
+ result = getUserTelAddress(tel)
+ code = result["code"]
+
+ if code !=0:
+ # DataYuan.insert({"QQ号":qq}) # 没有删除,因此也无需添加
+ pass
+ else:
+ data = result["data"]
+ old = DataYuan.find_one({"电话": tel})
+ DataResult.insert_one(
+ {"姓名": old["姓名"],"电话":old["电话"] ,"地区":data["province"],"地区2": data['city'], '手机归属': data['sp']})
+ DataYuan.delete_one({"电话": tel})
+ time.sleep(0.2)
+def run(data):
+ pool = Pool(10) # 多线程
+ pool.map(getinfo, data)
+
+def start():
+ while DataYuan.find().count() > 0:
+ data = []
+ for i in DataYuan.find():
+ data.append(i["电话"])
+ # print(data)
+ run(data)
+if __name__ == '__main__':
+ # loadData()
+ start()
diff --git a/python-apiproject/NOTAPI/get_user_tel_by_qq/ces.py b/python-apiproject/NOTAPI/get_user_tel_by_qq/ces.py
new file mode 100644
index 0000000..cad8ca8
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_by_qq/ces.py
@@ -0,0 +1,9 @@
+import pymongo
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+
+# DataYuan.insert_one({"姓名":"小明","年龄":9})
+
+print(DataYuan.find_one({"姓名":"小明"})["年龄"])
\ No newline at end of file
diff --git a/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode.py b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode.py
new file mode 100644
index 0000000..048126c
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode.py
@@ -0,0 +1,79 @@
+import json
+
+import pandas as pd
+import package_info as obj
+
+import pymongo
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+
+# 将这一千条数据添加到Mongodb
+# result = pd.read_excel("第一批.xlsx",sheet_name="Sheet1",header=0)["QQ号"]
+# print(result)
+# for i in result:
+# DataYuan.insert_one({"QQ号":i})
+# 数据添加完毕,请勿重复执行,因此上述代码注释掉
+# 从MongoDB读取数据
+
+now = 0
+for i in DataYuan.find():
+ count = DataYuan.find().count()
+ qq = (i["QQ号"])
+ result = obj.API_FromQQtoALl(qq)
+ code = result["code"]
+ data = result["data"]
+ if code==-1:
+ # DataYuan.insert({"QQ号":qq}) # 没有删除,因此也无需添加
+ pass
+ else:
+ DataResult.insert_one({"QQ":data['qq'],"手机号码":data['tel'],'手机归属地':data['address'],'微博ID':data['id']})
+ DataYuan.delete_one({"QQ号":qq})
+ now=now+1
+ print(str(now)+"/"+str(count))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# result = pd.read_excel("第一批.xlsx",0)
+# datas = result["QQ号"].tolist()
+# # print(datas)
+# # for i in range(0,len(result['QQ号'])):
+# result_all=[]
+# i = 0
+# for qq in datas:
+# result = obj.API_FromQQtoALl(qq)
+# code = result["code"]
+# data = result["data"]
+# if code==-1:
+# datas.append(qq)
+# print("[" + str(i) + "]", qq, "获取失败")
+# else:
+# result_all.append({"QQ":data['qq'],"手机号码":data['tel'],'手机归属地':data['address'],'微博ID':data['id']})
+# print("[" + str(i) + "]", qq, "获取完成")
+# i=i+1
+#
+# # print(result_all)
+# td = pd.DataFrame(columns=["QQ","手机号码",'手机归属地','微博ID'],data=result_all)
+# # td = pd.read_json(result_all)
+# # print(td)
+# td.to_excel('result.xlsx',encoding='utf-8')
+# print("完毕!")
+# # #
+#
diff --git a/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many.py b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many.py
new file mode 100644
index 0000000..7368e92
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many.py
@@ -0,0 +1,86 @@
+# 多线程
+import json
+import time
+from multiprocessing.dummy import Pool
+
+import pandas as pd
+import package_info as obj
+
+import pymongo
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+def loadData():
+ # 将这一千条数据添加到Mongodb
+ result = pd.read_excel("D:\softwareData\OneDriver\OneDrive\桌面\API\第二批.xlsx",sheet_name="Sheet1",header=0)["QQ号"]
+ print(result)
+ for i in result:
+ DataYuan.insert_one({"QQ号":i})
+ # 从MongoDB读取数据
+def getinfo(qq):
+ result = obj.API_FromQQtoALl(qq)
+ code = result["code"]
+ data = result["data"]
+ if code == -1:
+ # DataYuan.insert({"QQ号":qq}) # 没有删除,因此也无需添加
+ pass
+ else:
+ DataResult.insert_one(
+ {"QQ": data['qq'], "手机号码": data['tel'], '手机归属地': data['address'], '微博ID': data['id']})
+ DataYuan.delete_one({"QQ号": qq})
+ time.sleep(1)
+def run(data):
+ pool = Pool(5) # 多线程
+ pool.map(getinfo, data)
+ print("================Eed One Batch==============")
+
+
+
+while DataYuan.find().count()>0:
+ data = []
+ for i in DataYuan.find():
+ data.append(i["QQ号"])
+ run(data)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# result = pd.read_excel("第一批.xlsx",0)
+# datas = result["QQ号"].tolist()
+# # print(datas)
+# # for i in range(0,len(result['QQ号'])):
+# result_all=[]
+# i = 0
+# for qq in datas:
+# result = obj.API_FromQQtoALl(qq)
+# code = result["code"]
+# data = result["data"]
+# if code==-1:
+# datas.append(qq)
+# print("[" + str(i) + "]", qq, "获取失败")
+# else:
+# result_all.append({"QQ":data['qq'],"手机号码":data['tel'],'手机归属地':data['address'],'微博ID':data['id']})
+# print("[" + str(i) + "]", qq, "获取完成")
+# i=i+1
+#
+# # print(result_all)
+# td = pd.DataFrame(columns=["QQ","手机号码",'手机归属地','微博ID'],data=result_all)
+# # td = pd.read_json(result_all)
+# # print(td)
+# td.to_excel('result.xlsx',encoding='utf-8')
+# print("完毕!")
+# # #
+#
diff --git a/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many_20230818.py b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many_20230818.py
new file mode 100644
index 0000000..91fa83e
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many_20230818.py
@@ -0,0 +1,64 @@
+# 多线程
+
+
+'''
+
+细微的修改,主要是为了能结合cqhttp导出的群成员信息查询手机号
+
+'''
+
+#
+import json
+import time
+from multiprocessing.dummy import Pool
+
+import pandas as pd
+import package_info as obj
+
+import pymongo
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+def loadData():
+ # 将这一千条数据添加到Mongodb
+ url = r"D:\softwareData\OneDriver\OneDrive\桌面\查手机号\\908888409.xlsx"
+ result = pd.read_excel(url,sheet_name="Sheet1",header=0)["user_id"]
+ ncname= pd.read_excel(url, sheet_name="Sheet1", header=0)["nickname"]
+ ccname = pd.read_excel(url, sheet_name="Sheet1", header=0)["card"]
+ print(result)
+ jsq = 0
+ for i in result:
+ DataYuan.insert_one({"QQ号":i,"nickname":ncname[jsq],"card":ccname[jsq]})
+ jsq+=1
+ # 从MongoDB读取数据
+def getinfo(qq):
+ result = obj.API_FromQQtoALl(qq)
+ code = result["code"]
+ data = result["data"]
+ if code == -1:
+ # DataYuan.insert({"QQ号":qq}) # 没有删除,因此也无需添加
+ pass
+ else:
+ old = DataYuan.find_one({"QQ号": qq})
+ DataResult.insert_one(
+ {"QQ": data['qq'],"QQ名称":old["nickname"] ,"群名片":old["card"],"手机号码": data['tel'], '手机归属地': data['address'], '微博ID': data['id']})
+ DataYuan.delete_one({"QQ号": qq})
+ time.sleep(1)
+def run(data):
+ pool = Pool(5) # 多线程
+ pool.map(getinfo, data)
+ print("================Eed One Batch==============")
+
+
+def start():
+ while DataYuan.find().count()>0:
+ data = []
+ for i in DataYuan.find():
+ data.append(i["QQ号"])
+ run(data)
+
+
+if __name__ == '__main__':
+ # loadData()
+ start()
diff --git a/python-apiproject/NOTAPI/get_user_tel_by_qq/readme.md b/python-apiproject/NOTAPI/get_user_tel_by_qq/readme.md
new file mode 100644
index 0000000..97ad015
--- /dev/null
+++ b/python-apiproject/NOTAPI/get_user_tel_by_qq/readme.md
@@ -0,0 +1,84 @@
+# 通过QQ账号批量获取用户手机号
+
+2023-08-05 更新内容
+新增多线程模式
+
+
+萌狼蓝天 | 2023-08-04
+
+## 说明
+此文件是批量将Excel表格中的QQ号读取到MongoDB中,然后依次读取MongoDB中的数据,进行业务请求,获取需要的数据,将获取到的数据保存的MongoDB中
+
+## Code
+导入相关的包和准备数据库
+```python
+import json
+import pandas as pd
+import package_info as obj
+import pymongo
+myclient = pymongo.MongoClient('localhost', 27017) # 连接MongoDB
+db = myclient['temp_user_info']
+DataYuan = db['qqandtel']
+DataResult = db["result"]
+```
+
+
+下面的代码只能执行一遍,执行完注释掉,避免重复导入Excel表格数据到MongoDB
+```python
+# 将这一千条数据添加到Mongodb
+result = pd.read_excel("第一批.xlsx",sheet_name="Sheet1",header=0)["QQ号"]
+print(result)
+for i in result:
+ DataYuan.insert_one({"QQ号":i})
+# 数据添加完毕,请勿重复执行,因此上述代码注释掉
+```
+
+下面的代码是读取MongoDB中的QQ号,利用循环逐一的获取对应电话号码
+由于可能会存在请求失败的情况,请求失败的,因此需要多执行几次。
+对于获取成功的QQ号,会将MongoDB里面的QQ号删除掉,避免重复执行的时候,重复获取,导致重复添加到结果
+```python
+
+now = 0
+for i in DataYuan.find():
+ count = DataYuan.find().count()
+ qq = (i["QQ号"])
+ result = obj.API_FromQQtoALl(qq)
+ code = result["code"]
+ data = result["data"]
+ if code==-1:
+ # DataYuan.insert({"QQ号":qq}) # 没有删除,因此也无需添加
+ pass
+ else:
+ DataResult.insert_one({"QQ":data['qq'],"手机号码":data['tel'],'手机归属地':data['address'],'微博ID':data['id']})
+ DataYuan.delete_one({"QQ号":qq})
+ now=now+1
+ print(str(now)+"/"+str(count))
+
+
+```
+
+
+==================================================================
+Congratulations! Installed successfully!
+========================面板账户登录信息==========================
+
+ 外网面板地址: https://124.71.108.214:12536/633ec6bf
+ 内网面板地址: https://192.168.0.159:12536/633ec6bf
+ username: f23cy54c
+ password: 38ddd3ac
+
+=========================打开面板前请看===========================
+
+ 【云服务器】请在安全组放行 12536 端口
+ 因默认启用自签证书https加密访问,浏览器将提示不安全
+ 点击【高级】-【继续访问】或【接受风险并继续】访问
+ 教程:https://www.bt.cn/bbs/thread-117246-1-1.html
+
+==================================================================
+
+
+
+ 外网面板地址: https://43.156.233.131:16600/f2969f8a
+ 内网面板地址: https://10.0.0.2:16600/f2969f8a
+ username: j4dznejf
+ password: f980ca1b
diff --git a/python-apiproject/OpenCVTool/README.md b/python-apiproject/OpenCVTool/README.md
new file mode 100644
index 0000000..65c46a0
--- /dev/null
+++ b/python-apiproject/OpenCVTool/README.md
@@ -0,0 +1,41 @@
+本文件夹内提供使用OpenCV相关功能实现的接口
+
+## 图片压缩接口(C/S)
+
+### 单张图压缩
+
+接口地址:`/img/zip/jpg`
+
+方法:`POST`
+
+参数:
+ - img:图片文件
+ - level:压缩等级
+ - output:输出路径
+
+返回值:
+ - code:结果代码(0 -写出文件错误 1 -正常 -1 -图片处理错误 -2 -图片压缩等级出错)
+ - data:
+ - state:结果代码 同code
+ - result:结果描述
+ - outpath:输出路径
+
+### 多张图压缩
+
+接口地址:`/img/zip/jpg/many`
+
+方法:`POST`
+
+参数:
+ - imgs:
+ - imgs:图片列表
+ - level:压缩等级(字符型)
+ - outpath:输出路径,列表
+
+返回值:
+ - data:
+ - result:结果集,是一个列表,列表元素为每一张图片的处理结果
+ - state:结果代码
+ - result:结果描述
+ - outpath:输出路径
+
diff --git a/python-apiproject/OpenCVTool/__init__.py b/python-apiproject/OpenCVTool/__init__.py
new file mode 100644
index 0000000..6aa30f8
--- /dev/null
+++ b/python-apiproject/OpenCVTool/__init__.py
@@ -0,0 +1,85 @@
+# import json
+# import requests
+# from flask import request, Blueprint
+# # from pydantic import BaseModel
+#
+# import OpenCVTool.img_zip as PicDeal
+# from dynamic_toekn.key_create import random_key
+#
+# API_OpenCVTool = Blueprint("API_OpenCVTool", __name__)
+#
+#
+# # 这个接口之前是应用于本地的,如果应用于web,应当做一些调整
+# # 单图处理
+# # @API_OpenCVTool.route('/img/zip/jpg', methods='POST')
+# def img_zip_jpg(img, level, outpath):
+# result = PicDeal.zipJPG(img, level, outpath=outpath)
+# state = "1"
+# if result == "ERROR-IMG-ZIP-JPG-WRITE":
+# state = "0"
+# if result == "ERROR-IMG-ZIP-JPG-DEAL":
+# state = "-1"
+# if result == "ERROR-IMG-ZIP-JPG-LEVEL":
+# state = "-2"
+# return {"code": state, "data": {"state": state, "result": result, 'outpath': outpath}}
+#
+#
+# # 多图对象
+# class Imgs(BaseModel):
+# imgs = [] # type: list[str]
+# level = "" # type: str
+# outpath = [] # type: list[str]
+#
+#
+# # 多图处理
+# # @API_OpenCVTool.route('/img/zip/jpg/many', methods='POST')
+# def img_zip_jpg_many(Imgs: Imgs):
+# print(Imgs)
+# result = []
+# for i in range(len(Imgs.imgs)):
+# r = PicDeal.zipJPG(Imgs.imgs[i], Imgs.level, Imgs.outpath[i])
+# state = "1"
+# if r == "ERROR-IMG-ZIP-JPG-WRITE":
+# state = "0"
+# if r == "ERROR-IMG-ZIP-JPG-DEAL":
+# state = "-1"
+# if r == "ERROR-IMG-ZIP-JPG-LEVEL":
+# state = "-2"
+# result.append({"state": state, "result": r, 'outpath': Imgs.outpath[i]})
+# return {"data": {"result": result}}
+#
+#
+# # 多图对象
+# class ImgObject(BaseModel):
+# imgs :list # type: list[str]
+# level :str # type: str
+# taskid :str # type: str
+#
+#
+# # 直接重构多图处理方法为web接口
+# # base64的方式返回结果
+# @API_OpenCVTool.route('/img/zip/jpg/many', methods=['POST'])
+# def img_zip_jpg_many_web():
+#
+# imgs = request.files
+# level = request.form["level"]
+# taskid = request.form["taskid"]
+# outpath = []
+# print(imgs)
+# # for i in imgs["imgs"]:
+# # print(i.)
+# # outpath.append(random_key(taskid) + ".jpg") # 关于扩展名,尝试自己去获取扩展名
+# # #
+# # result = []
+# # for i in range(len(Imgs.imgs)):
+# # r = PicDeal.zipJPG(Imgs.imgs[i], Imgs.level, outpath[i])
+# # state = "1"
+# # if r == "ERROR-IMG-ZIP-JPG-WRITE":
+# # state = "0"
+# # if r == "ERROR-IMG-ZIP-JPG-DEAL":
+# # state = "-1"
+# # if r == "ERROR-IMG-ZIP-JPG-LEVEL":
+# # state = "-2"
+# # result.append({"state": state, "result": r, 'outpath': outpath[i]})
+# return {"data": {"result": 0}}
+#
diff --git a/python-apiproject/OpenCVTool/img_zip.py b/python-apiproject/OpenCVTool/img_zip.py
new file mode 100644
index 0000000..f41f9a2
--- /dev/null
+++ b/python-apiproject/OpenCVTool/img_zip.py
@@ -0,0 +1,54 @@
+# # -*- coding: UTF-8 -*-
+# # 开发人员:萌狼蓝天
+# # 博客:Https://mllt.cc
+# # 笔记:Https://cnblogs.com/mllt
+# # 哔哩哔哩/微信公众号:萌狼蓝天
+# # 开发时间:2022/10/21
+# import urllib.parse as parse
+#
+# import cv2 as cv
+# from PIL import Image
+# import numpy as np
+# import os
+# def zipJPG(img,level,outpath):
+# img = parse.unquote(img)
+# outpath=parse.unquote(outpath)
+# print(img)
+# img=img.replace("%20"," ")
+# outpath = outpath.replace("%20", " ")
+# print(img)
+# img = Image.open(img) # 避免P模式图片造成异常
+# # print(img.mode)
+# # 转换图片模式为RGB
+# img = img.convert("RGB")
+# img = cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
+# # 转换为np数组
+# # [1]cv.IMREAD_COLOR:加载彩色图像,任何图像的透明度都会被忽略,它是默认标志
+# # [0]cv.IMREAD_GRAYSCALE:以灰度模式加载图像
+# # [-1]cv.IMREAD_UNCHANGED:加载图像,包括 alpha 通道
+# try:
+# level=int(level)
+# except:
+# return "ERROR-IMG-ZIP-JPG-LEVEL"
+# if level>100:
+# level=100
+# if level<0:
+# level=0
+# try:
+# cv.imwrite("./temp.jpg",img,[cv.IMWRITE_JPEG_QUALITY,level])
+# img = Image.open("temp.jpg")
+# img.save(outpath)
+# if(os.path.exists(outpath)):
+# return outpath
+# else:
+# return "ERROR-IMG-ZIP-JPG-WRITE"
+# except Exception as e:
+# print(e)
+# return "ERROR-IMG-ZIP-JPG-DEAL"
+# # 对于JPEG格式的图片,这个参数表示从0 - 100的图片质量(CV_IMWRITE_JPEG_QUALITY), 默认值是95.
+# #
+# # 对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0 - 9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.
+# #
+# # 对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.
+# # 判断文件是否存在,存在则返回成功,失败则返回失败
+#
diff --git a/python-apiproject/Readme.md b/python-apiproject/Readme.md
new file mode 100644
index 0000000..8d3a342
--- /dev/null
+++ b/python-apiproject/Readme.md
@@ -0,0 +1,12 @@
+## API服务
+
+使用Python后端实现的API服务项目,建设通用API,供其他项目使用,避免重复造轮子。
+
+【UPDATE】2023年9月4日
+* [新增] 图片压缩接口
+
+【UPDATE】2023年8月5日
+
+* [新增]通过QQ查询电话号码的API
+* [进行中]动态加密令牌生成与查询API
+* [待处理]邮件发送接口 当前邮件发送代码格式不符合规范
\ No newline at end of file
diff --git a/python-apiproject/__init__.py b/python-apiproject/__init__.py
new file mode 100644
index 0000000..8031499
--- /dev/null
+++ b/python-apiproject/__init__.py
@@ -0,0 +1,69 @@
+# -*- coding: UTF-8 -*-
+# 开发人员:萌狼蓝天
+# 博客:Https://mllt.cc
+# 笔记:Https://cnblogs.com/mllt
+# 哔哩哔哩/微信公众号:萌狼蓝天
+# 开发时间:2022/5/6
+# Coding:UTF-8
+import flask, json
+from flask import request
+import oemail
+from flask_cors import CORS, cross_origin # 导入包
+from functools import wraps
+from flask import make_response
+from flask import render_template
+
+
+
+server = flask.Flask(__name__) # 将该py文件转为一个服务
+
+from package_info import API_INFO
+server.register_blueprint(API_INFO)
+from dynamic_toekn import API_DyNamicToken
+server.register_blueprint(API_DyNamicToken)
+# from OpenCVTool import API_OpenCVTool
+# server.register_blueprint(API_OpenCVTool)
+CORS(server, supports_credentials=True) # 设置参数
+def allow_cross_domain(fun):
+ @wraps(fun)
+ def wrapper_fun(*args, **kwargs):
+ rst = make_response(fun(*args, **kwargs))
+ rst.headers['Access-Control-Allow-Origin'] = '*'
+ rst.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE,OPTIONS,*'
+ allow_headers = "Referer,Accept,Origin,User-Agent"
+ rst.headers['Access-Control-Allow-Headers'] = allow_headers
+ return rst
+ return wrapper_fun
+@server.route('/', methods=["GET"])
+def index():
+ return render_template('index.html')
+@server.route('/doc', methods=["GET"])
+def document():
+ return render_template('document.html')
+@server.route('/docs/doc', methods=["GET"])
+def documentReturn():
+ return render_template('document.html')
+@server.route('/docs/qq', methods=["GET"])
+def page_doc_info_qq():
+ return render_template('info/qq.html')
+
+
+@server.errorhandler(404)
+def page_not_found(e):
+ return render_template('404.html'), 404
+@server.errorhandler(500)
+def internal_server_error(e):
+ return render_template('500.html'), 500
+
+
+@server.route('/email/code', methods=['post'])
+@allow_cross_domain
+def emailSendCode():
+ receiver = request.values.get('receiver')
+ name = request.values.get('name')
+ key = request.values.get('key')
+ # key="qq2686485465"
+ return oemail.send(receiver, name, key)
+
+if __name__ == '__main__':
+ server.run(debug=False, port=2312, host='0.0.0.0') # 指定端口,host,0.0.0.0代表不管几个网卡,任何ip都可访问
diff --git a/python-apiproject/dynamic_toekn/Readme.md b/python-apiproject/dynamic_toekn/Readme.md
new file mode 100644
index 0000000..9aa3021
--- /dev/null
+++ b/python-apiproject/dynamic_toekn/Readme.md
@@ -0,0 +1,13 @@
+# 动态令牌
+
+本区域提供动态令牌生成与查询功能,目前主要是为了避免接口滥用
+
+此项目部分接口将会采用动态令牌来确保无权限人员不能请求接口
+
+## 算法
+
+为了能满足多个项目的需求,本区域动态令牌生成方式将会实现多种算法以供选择
+
+## 存储
+
+令牌存储通过MongoDB存储,字段包括id,令牌,生成时间,备注
\ No newline at end of file
diff --git a/python-apiproject/dynamic_toekn/__init__.py b/python-apiproject/dynamic_toekn/__init__.py
new file mode 100644
index 0000000..8df74f3
--- /dev/null
+++ b/python-apiproject/dynamic_toekn/__init__.py
@@ -0,0 +1,4 @@
+import json
+import requests
+from flask import request, Blueprint
+API_DyNamicToken = Blueprint("API_DyNamicToken", __name__)
\ No newline at end of file
diff --git a/python-apiproject/dynamic_toekn/key_create.py b/python-apiproject/dynamic_toekn/key_create.py
new file mode 100644
index 0000000..6d2d786
--- /dev/null
+++ b/python-apiproject/dynamic_toekn/key_create.py
@@ -0,0 +1,13 @@
+import hashlib
+
+from dynamic_toekn.token_create import createTempToken
+
+
+def md5_32_big(s):
+ result = hashlib.md5(s.encode("utf-8")).hexdigest().upper()
+ return result
+def md5_32_sm(s):
+ result = hashlib.md5(s.encode("utf-8")).hexdigest().lower()
+ return result
+def random_key(p=""):
+ return md5_32_sm(p+str(createTempToken()))
\ No newline at end of file
diff --git a/python-apiproject/dynamic_toekn/token_create.py b/python-apiproject/dynamic_toekn/token_create.py
new file mode 100644
index 0000000..2103d08
--- /dev/null
+++ b/python-apiproject/dynamic_toekn/token_create.py
@@ -0,0 +1,24 @@
+import base64
+import datetime
+import hashlib
+import time
+import random
+
+# 随机的token 随机数+随机时间+固定字符串
+def createTempToken(): # 生成一个临时的Token
+ data = {
+ "t":time.time(),
+ "r":random.random(),
+ 's':random.randint(0,99999),
+ 'admin':'萌狼蓝天',
+ 'QQ':'2952458479',
+ 'email':'mllt9920@qq.com',
+ 'type':'temp token'
+ ''
+ }
+ pwd = hashlib.sha256((str(random.random())+"|"+str(datetime.date)+"|"+str(datetime.time)+"|"+str(random.random())+"|"+str(data)).encode('utf-8')).hexdigest()
+ result = str(base64.b64encode((str(data)+"&"+str(pwd)).encode('utf-8')),'utf-8')
+ return result
+# 接收内容 将内容转为字符串后加密为base64
+def createBase64(data):
+ return str(base64.b64encode(str(data).encode('utf-8')), 'utf-8')
\ No newline at end of file
diff --git a/python-apiproject/index.bat b/python-apiproject/index.bat
new file mode 100644
index 0000000..c81edec
--- /dev/null
+++ b/python-apiproject/index.bat
@@ -0,0 +1 @@
+pip3 freeze requirements.txt
\ No newline at end of file
diff --git a/python-apiproject/oemail/__init__.py b/python-apiproject/oemail/__init__.py
new file mode 100644
index 0000000..551d0f9
--- /dev/null
+++ b/python-apiproject/oemail/__init__.py
@@ -0,0 +1,97 @@
+# -*- coding: UTF-8 -*-
+# 开发人员:萌狼蓝天
+# 博客:Https://mllt.cc
+# 笔记:Https://cnblogs.com/mllt
+# 哔哩哔哩/微信公众号:萌狼蓝天
+# 开发时间:2022/5/6
+# Coding:UTF-8
+import hashlib
+
+import flask, json
+from flask import request
+import smtplib
+from email.mime.image import MIMEImage
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from email.header import Header
+import random
+server = flask.Flask(__name__) # 将该py文件转为一个服务
+class EmailSentObject():
+ """
+ 发送邮件对象
+ """
+ mail_host = "smtp.ym.163.com" # 网易企业邮箱SMTP服务器
+ mail_admin = '' # 企业邮箱账号
+ mail_pwd = '' # 企业邮箱密码
+ mail_sender = "" # 企业邮箱账号
+ admin_name = "萌狼工作室" # 发信人姓名 请查阅 https://www.cnblogs.com/mllt/p/18286902
+ admin_email = mail_sender # 发信人邮箱 与企业邮箱账号保持一致
+ # nc -w 2 smtp.ym.163.com 465 < /dev/null && echo "port is ok"
+ def __init__(self, receiver_email, receivers_name, subject, content):
+ """
+ 邮件发送对象参数
+ :param receiver_email: 接收者邮件,类型为List
+ :param receivers_name: 接收者姓名,类型为string
+ :param subject: 邮件主题,类型为string
+ :param content: 邮件正文,支持解析HTML标签,类型为string
+ """
+ self.receivers_eamil = receiver_email # 接收者邮件,类型为List
+ self.receivers_name = receivers_name # 接收者姓名,类型为string
+ self.subject = subject # 邮件主题,类型为string
+ self.content = content # 邮件正文,支持解析HTML标签,类型为string
+
+ def sent(self):
+ """
+ 发送邮件
+ :return: 成功返回 True | 失败返回 False
+ """
+ message = MIMEMultipart('related')
+ message['From'] = Header('{}<{}>'.format(self.admin_name, self.admin_email), 'utf-8') # 发信人
+ message['To'] = Header(self.receivers_name, 'utf-8') # 收信人
+ message['Subject'] = Header(self.subject, 'utf-8') # 邮件主题
+ msgAlternative = MIMEMultipart('alternative')
+ message.attach(msgAlternative)
+ msgAlternative.attach(MIMEText(self.content, 'html', 'utf-8'))
+ try:
+ smtpObj = smtplib.SMTP_SSL(self.mail_host) # 连接发信服务器
+ smtpObj.connect(self.mail_host, 465)
+ smtpObj.login(self.mail_admin, self.mail_pwd) # 发信账号连接
+ smtpObj.sendmail(self.mail_sender, self.receivers_eamil, message.as_string()) # 发送邮件
+ return True
+ except smtplib.SMTPException:
+ return False
+def sendEmailCode(receiver, name):
+ code = str(random.randint(0, 10)) + str(random.randint(0, 9)) + str(random.randint(0, 9)) + str(
+ random.randint(0, 9)) + str(random.randint(0, 9)) + str(random.randint(0, 9))
+ subject = "【验证码】萌狼工作室旗下产品用户操作验证码"
+ content = """
+
[萌狼工作室]操作验证,您的验证码为
+ {}
+
验证码10分钟内有效。
+ 如果这不是你自己操作获得的邮件,忽略即可。
+ (本邮件自动发送,无需回复)
+ """.format(code)
+ sent = EmailSentObject(receiver, name, subject, content).sent()
+ if sent:
+ return code
+ else:
+ return -1
+
+
+def send(receiver,name,key):
+ if receiver == "":
+ return {"Error": 0, "提示": "未填写收信邮箱"} # 未填写邮箱
+ if name == "":
+ name = receiver
+ md5hash = hashlib.md5()
+ md5hash.update(key.encode(encoding='utf-8'))
+ md5 = md5hash.hexdigest()
+ if (md5 == "ffb4f6bee9830f0abbc215356a91ed2e"):
+ code = sendEmailCode(receiver, name)
+ if (code == -1):
+ # 邮件发送失败
+ return {"Error": -2, "提示": "发送失败"} # 邮件发送失败
+ return {"user": name, "oemail": receiver, "code": code}
+ return {"Error": -1, "提示": "没有权限"} # 无权限操作
+
+
diff --git a/python-apiproject/package_info/__init__.py b/python-apiproject/package_info/__init__.py
new file mode 100644
index 0000000..825b1e7
--- /dev/null
+++ b/python-apiproject/package_info/__init__.py
@@ -0,0 +1,182 @@
+import json
+
+import requests
+from flask import request, Blueprint
+
+API_INFO = Blueprint("API_INFO", __name__)
+
+
+@API_INFO.route('/apis/info/qq', methods=["POST"])
+def api_info_fromQQToAll():
+ data = request.get_data().decode("utf-8")
+ if data=="":
+ data= request.values.to_dict()
+ print(type(data), data)
+ else:
+ data = json.loads(data)
+ try:
+ qq = data["qq"]
+ print("test:",qq)
+ except:
+ return {"code": -1, "message": "请输入正确的QQ账号", "data": {}}
+ if "/" in qq:
+ result_all = []
+ # 批量获取
+ qqlist = qq.split("/")
+ for i in qqlist:
+ print("===========")
+ print("==查询QQ号==", i)
+ result = API_FromQQtoALl(i)
+ print("==查询结果==:", result)
+ if result["code"] != 1:
+ qqlist.append(i) # 失败了,就把这个QQ号添加进去,到时候重新执行一次 但是这样容易出现一直请求失败然后导致死循环问题
+ else:
+ result_all.append(result["data"])
+ return {"code": 1, "message": "sucess", "data": result_all}
+ return API_FromQQtoALl(qq)
+
+# 功能方法 - 取中间文本
+def getCenterContent(s, l, r):
+ text = s
+ start_text = l
+ end_text = r
+
+ start_index = text.find(start_text)
+ end_index = text.find(end_text)
+
+ if start_index >= 0 and end_index >= 0:
+ middle_text = text[start_index + len(start_text):end_index]
+ return middle_text
+ else:
+ return ""
+
+
+# 未完成的接口 因为这个API获取到的QQ名称是乱码
+def API_FromQQToQQName(QQNumber):
+ print(QQNumber)
+ response = requests.request("POST", "https://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg",
+ data={"uins": QQNumber},
+ headers={
+ # "Accept-Encoding":"",
+ "Content-Type": 'application/json; charset=UTF-8'
+ })
+ print(response.headers["Content-Type"])
+ # print(response.content.decode("utf-8").encode('raw_unicode_escape'))
+ # print(response.content)
+ response = response.text
+ print(response)
+ # encoding = chardet.detect(response)["encoding"]
+ # print(encoding)
+ # response = response.decode(encoding)
+
+ try:
+ response = getCenterContent(response, "portraitCallBack(", ")")
+ if response == "":
+ return ""
+ response = json.loads(json.loads(json.dumps(response)))
+ info = response[str(QQNumber)]
+ name = info[6]
+ name = name.encode("utf-8").decode("utf-8")
+ print(name)
+ return info[0], name
+ except Exception as e:
+ print(e)
+ return {"code": -1, "message": "服务器异常,请重试", "data": {}}
+
+# 通过QQ获取电话
+def API_FromQqToTel(QQNumber):
+ # 获取手机号
+ response = requests.request("POST", "https://zy.xywlapi.cc/qqapi", data={"qq": QQNumber}).content.decode("utf-8")
+ try:
+ # print(response)
+ response = json.loads(json.loads(json.dumps(response)))
+ print(response)
+ # print(response)
+ if response["status"] == 200:
+ return {"code": 1, "message": response["message"], "data": {
+ "qq": QQNumber,
+ "tel": response["phone"],
+ "address": response["phonediqu"]
+ }}
+ elif response["status"] == 500:
+ return {"code": 0, "message": response["message"], "data": {}}
+ else:
+ return {"code": -1, "message": response["message"], "data": {}}
+ except Exception as e:
+ print('==============Err Info Start==================')
+ print(e,'\n',str(e))
+ print(response)
+ print('==============Err Info End==================')
+ return {"code": -1, "message": "服务器异常,请重试", "data": {}}
+
+
+# 通过电话获取QQ
+def API_FromTelToQQ(TelNumber):
+ response = requests.request("POST", "https://zy.xywlapi.cc/qqphone", data={"phone": TelNumber}).content.decode(
+ "utf-8")
+ try:
+ # print(response)
+ response = json.loads(json.loads(json.dumps(response)))
+ # print(response)
+ if response["status"] == 200:
+ return {"code": 1, "message": response["message"], "data": {
+ "qq": response["qq"],
+ "tel": TelNumber,
+ "address": response["phonediqu"]
+ }}
+ elif response["status"] == 500:
+ return {"code": 0, "message": response["message"], "data": {}}
+ else:
+ return {"code": -1, "message": response["message"], "data": {}}
+ except:
+ return {"code": -1, "message": "服务器异常,请重试", "data": {}}
+
+
+def API_FromTelToWeiBo(TelNumber):
+ response = requests.request("POST", "https://zy.xywlapi.cc/wbphone", data={"phone": TelNumber}).content.decode(
+ "utf-8")
+ try:
+ # print(response)
+ response = json.loads(json.loads(json.dumps(response)))
+ # print(response)
+ if response["status"] == 200:
+ return {"code": 1, "message": response["message"], "data": {
+ "id": response["id"],
+ "tel": TelNumber,
+ "address": response["phonediqu"]
+ }}
+ elif response["status"] == 500:
+ return {"code": 0, "message": response["message"], "data": {}}
+ else:
+ return {"code": -1, "message": response["message"], "data": {}}
+ except:
+ return {"code": -1, "message": "服务器异常,请重试", "data": {}}
+
+# 功能聚合接口,整合上面的接口,实现通过QQ号获取到全部信息
+def API_FromQQtoALl(QQNumber):
+ res = API_FromQqToTel(QQNumber)
+ qq = QQNumber
+ if res["code"] == 1:
+ tel = res["data"]["tel"]
+ address = res["data"]["address"]
+ res2 = API_FromTelToWeiBo(tel)
+ if res2["code"] == 1:
+ id = res2["data"]["id"]
+ else:
+ id = "无"
+ return {"code": 1, "message": "success", "data": {
+ "qq": qq,
+ "tel": tel,
+ "id": id,
+ "address": address
+ }}
+ elif res["code"] == 0:
+ return {"code": 1, "message": "success", "data": {
+ "qq": qq,
+ "tel": '无',
+ "id": '无',
+ "address": '无'
+ }}
+ else:
+ return {"code": -1, "message": "服务器异常,请重试。一直失败请联系萌狼蓝天维护(哔哩哔哩/CSDN 私信 萌狼蓝天)",
+ "data": {}}
diff --git a/python-apiproject/requirements.txt b/python-apiproject/requirements.txt
new file mode 100644
index 0000000..e69de29
diff --git a/python-apiproject/templates/404.html b/python-apiproject/templates/404.html
new file mode 100644
index 0000000..bc8726b
--- /dev/null
+++ b/python-apiproject/templates/404.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ Page Not Found
+
+
+
+
+
4 0 4
+
+ Page not found
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/templates/500.html b/python-apiproject/templates/500.html
new file mode 100644
index 0000000..5de905d
--- /dev/null
+++ b/python-apiproject/templates/500.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ 萌狼工作室 Error-500
+
+
+
+
+
500
+
+ Oh……Maybe the website was
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/templates/document.html b/python-apiproject/templates/document.html
new file mode 100644
index 0000000..b282b97
--- /dev/null
+++ b/python-apiproject/templates/document.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+ 萌狼工作室
+
+
+
+
+
萌狼工作室 - 接口文档
+
+ Oh!Why you know this page?!
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/templates/index.html b/python-apiproject/templates/index.html
new file mode 100644
index 0000000..5d63c90
--- /dev/null
+++ b/python-apiproject/templates/index.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ 萌狼工作室
+
+
+
+
+
萌狼工作室
+
+ The website has nothing. Where did you come from, where go back!
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/templates/info/qq.html b/python-apiproject/templates/info/qq.html
new file mode 100644
index 0000000..6775b9b
--- /dev/null
+++ b/python-apiproject/templates/info/qq.html
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+ 萌狼工作室
+
+
+
+
+
萌狼工作室
+
+
+ 信息查询接口
通过QQ账号查询所绑定的手机号、手机号归属地、微博id
+ 该接口随时可能失效,如果失效了请联系萌狼蓝天
(去哔哩哔哩/CSDN 私信 萌狼蓝天)
+
+
+
POSThttp://api.mllt.cc/apis/info/qq
+
+
参数
+
+ qqQQ账号,支持多个QQ账号查询,账号之间使用左斜杠 / 隔开
+
+
返回值
+
+ 成功
+
+
+ {
+ "code":1,
+ "message":"相关消息",
+ "data":{
+ "qq":"QQ账号",
+ "tel":"手机号码",
+ "id":"微博id",
+ "address":"手机号归属地"
+ }
+ }
+
+
+
+ 失败
+
+
+ {
+ "code":"相关失败代码,一般是-1",
+ "message":"失败原因",
+ "data":{}
+ }
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python-apiproject/请求证书.txt b/python-apiproject/请求证书.txt
new file mode 100644
index 0000000..180329d
--- /dev/null
+++ b/python-apiproject/请求证书.txt
@@ -0,0 +1,31 @@
+mkdir -p /root/.certs/
+echo -n | openssl s_client -connect smtp.ym.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt
+certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
+certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
+certutil -L -d /root/.certs
+
+cd /root/.certs/
+certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
+
+ # set from=xrilang@mllt.cc #之前设置好的邮箱地址
+ # set smtp=smtps://smtp.ym.163.com:465 #邮件服务器
+ # set smtp-auth-user=xrilang@mllt.cc #之前设置好的邮箱地址
+ # set smtp-auth-password=qq2686485465 #授权码
+ # set smtp-auth=login #默认login
+ # set ssl-verify=ignore #ssl认证方式
+ # set nss-config-dir=/root/.certs #证书所在目录
+
+ # set from=xrilang@mllt.cc #之前设置好的邮箱地址
+ # set smtp=smtps://smtp.ym.163.com:465 #邮件服务器
+ # set smtp-auth-user=xrilang@mllt.cc #之前设置好的邮箱地址
+ # set smtp-auth-password=qq2686485465 #授权码
+ # set smtp-auth=login #默认login
+ # set ssl-verify=ignore #ssl认证方式
+ # set nss-config-dir=/root/.certs #证书所在目录
+
+
+------------------------------------------------------------------------------
+systemctl disable postfix
+systemctl stop postfix
+systemctl disable sendmail
+systemctl stop sendmail
diff --git a/q-binding-query/App.vue b/q-binding-query/App.vue
new file mode 100644
index 0000000..6edd7bb
--- /dev/null
+++ b/q-binding-query/App.vue
@@ -0,0 +1,27 @@
+
+
+
diff --git a/q-binding-query/README.md b/q-binding-query/README.md
new file mode 100644
index 0000000..4e9133b
--- /dev/null
+++ b/q-binding-query/README.md
@@ -0,0 +1,7 @@
+# 查询Q绑手机号
+
+Uni-app程序,支持编译为小程序、app、网页
+
+本仓库只包含前端内容
+
+业务后端有Python API项目提供
\ No newline at end of file
diff --git a/q-binding-query/androidPrivacy.json b/q-binding-query/androidPrivacy.json
new file mode 100644
index 0000000..b617bdb
--- /dev/null
+++ b/q-binding-query/androidPrivacy.json
@@ -0,0 +1,38 @@
+{
+ "version": "1",
+ "prompt": "template",
+ "title": "服务协议和隐私政策",
+ "message": " 请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。
你可阅读《服务协议》和《隐私政策》了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+ "buttonAccept": "同意并接受",
+ "buttonRefuse": "暂不同意",
+ "hrefLoader": "system|default",
+ "backToExit":"false",
+ "second": {
+ "title": "确认提示",
+ "message": " 进入应用前,你需先同意《服务协议》和《隐私政策》,否则将退出应用。",
+ "buttonAccept": "同意并继续",
+ "buttonRefuse": "退出应用"
+ },
+ "disagreeMode":{
+ "support": false,
+ "loadNativePlugins": false,
+ "visitorEntry": true,
+ "showAlways": false
+ },
+ "styles": {
+ "backgroundColor": "#ffffff",
+ "borderRadius":"5px",
+ "title": {
+ "color": "#000000"
+ },
+ "buttonAccept": {
+ "color": "#55ff00"
+ },
+ "buttonRefuse": {
+ "color": "#ff5500"
+ },
+ "buttonVisitor": {
+ "color": "#000000"
+ }
+ }
+}
diff --git a/q-binding-query/index.html b/q-binding-query/index.html
new file mode 100644
index 0000000..47bd1a2
--- /dev/null
+++ b/q-binding-query/index.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/q-binding-query/main.js b/q-binding-query/main.js
new file mode 100644
index 0000000..c1caf36
--- /dev/null
+++ b/q-binding-query/main.js
@@ -0,0 +1,22 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+ const app = createSSRApp(App)
+ return {
+ app
+ }
+}
+// #endif
\ No newline at end of file
diff --git a/q-binding-query/manifest.json b/q-binding-query/manifest.json
new file mode 100644
index 0000000..7503e6f
--- /dev/null
+++ b/q-binding-query/manifest.json
@@ -0,0 +1,125 @@
+{
+ "name" : "查询QQ绑定手机",
+ "appid" : "__UNI__FC2D3D9",
+ "description" : "查询QQ号所绑定的手机号",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {},
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
+ "minSdkVersion" : 21
+ },
+ /* ios打包配置 */
+ "ios" : {
+ "dSYMs" : false
+ },
+ /* SDK配置 */
+ "sdkConfigs" : {
+ "ad" : {
+ "ks" : {},
+ "ks-content" : {},
+ "sigmob" : {}
+ }
+ },
+ "icons" : {
+ "android" : {
+ "hdpi" : "unpackage/res/icons/72x72.png",
+ "xhdpi" : "unpackage/res/icons/96x96.png",
+ "xxhdpi" : "unpackage/res/icons/144x144.png",
+ "xxxhdpi" : "unpackage/res/icons/192x192.png"
+ },
+ "ios" : {
+ "appstore" : "unpackage/res/icons/1024x1024.png",
+ "ipad" : {
+ "app" : "unpackage/res/icons/76x76.png",
+ "app@2x" : "unpackage/res/icons/152x152.png",
+ "notification" : "unpackage/res/icons/20x20.png",
+ "notification@2x" : "unpackage/res/icons/40x40.png",
+ "proapp@2x" : "unpackage/res/icons/167x167.png",
+ "settings" : "unpackage/res/icons/29x29.png",
+ "settings@2x" : "unpackage/res/icons/58x58.png",
+ "spotlight" : "unpackage/res/icons/40x40.png",
+ "spotlight@2x" : "unpackage/res/icons/80x80.png"
+ },
+ "iphone" : {
+ "app@2x" : "unpackage/res/icons/120x120.png",
+ "app@3x" : "unpackage/res/icons/180x180.png",
+ "notification@2x" : "unpackage/res/icons/40x40.png",
+ "notification@3x" : "unpackage/res/icons/60x60.png",
+ "settings@2x" : "unpackage/res/icons/58x58.png",
+ "settings@3x" : "unpackage/res/icons/87x87.png",
+ "spotlight@2x" : "unpackage/res/icons/80x80.png",
+ "spotlight@3x" : "unpackage/res/icons/120x120.png"
+ }
+ }
+ },
+ "splashscreen" : {
+ "useOriginalMsgbox" : true
+ }
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wx58b4ae06f6ba38c1",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "3",
+ "locale" : "zh-Hans",
+ "fallbackLocale" : "zh-Hans",
+ "h5" : {
+ "title" : "信息查询",
+ "router" : {
+ "mode" : "history"
+ }
+ }
+}
diff --git a/q-binding-query/pages.json b/q-binding-query/pages.json
new file mode 100644
index 0000000..e7f2351
--- /dev/null
+++ b/q-binding-query/pages.json
@@ -0,0 +1,26 @@
+{
+ "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "查询QQ绑定的手机"
+ }
+ }
+ ,{
+ "path" : "pages/info/InfoFromQQ/InfoFromQQ",
+ "style" :
+ {
+ "navigationBarTitleText": "",
+ "enablePullDownRefresh": false
+ }
+
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "Why Not Fly —— 萌狼蓝天",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "uniIdRouter": {}
+}
diff --git a/q-binding-query/pages/index/index.vue b/q-binding-query/pages/index/index.vue
new file mode 100644
index 0000000..1883a3f
--- /dev/null
+++ b/q-binding-query/pages/index/index.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
批量查询业务请联系哔哩哔哩萌狼蓝天
+
查询失效请联系萌狼蓝天进行维护
+
返回结果为无则是未查询到
+
最后一次更新:2023-08-05
+
+
+
+
+
+
diff --git a/q-binding-query/pages/info/InfoFromQQ/InfoFromQQ.vue b/q-binding-query/pages/info/InfoFromQQ/InfoFromQQ.vue
new file mode 100644
index 0000000..80d8b5f
--- /dev/null
+++ b/q-binding-query/pages/info/InfoFromQQ/InfoFromQQ.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
Q Q :{{qq}}
+
手机:{{tel}}
+
归 属 地:{{address}}
+
微 博 ID:{{wb}}
+
+
+
+
+
+
+
diff --git a/q-binding-query/static/LOGO.png b/q-binding-query/static/LOGO.png
new file mode 100644
index 0000000..7afe67e
Binary files /dev/null and b/q-binding-query/static/LOGO.png differ
diff --git a/q-binding-query/uni.promisify.adaptor.js b/q-binding-query/uni.promisify.adaptor.js
new file mode 100644
index 0000000..47fbce1
--- /dev/null
+++ b/q-binding-query/uni.promisify.adaptor.js
@@ -0,0 +1,10 @@
+uni.addInterceptor({
+ returnValue (res) {
+ if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+ return res;
+ }
+ return new Promise((resolve, reject) => {
+ res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+ });
+ },
+});
\ No newline at end of file
diff --git a/q-binding-query/uni.scss b/q-binding-query/uni.scss
new file mode 100644
index 0000000..a05adb4
--- /dev/null
+++ b/q-binding-query/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/q-binding-query/unpackage/cache/apk/__UNI__FC2D3D9_cm.apk b/q-binding-query/unpackage/cache/apk/__UNI__FC2D3D9_cm.apk
new file mode 100644
index 0000000..0cab076
Binary files /dev/null and b/q-binding-query/unpackage/cache/apk/__UNI__FC2D3D9_cm.apk differ
diff --git a/q-binding-query/unpackage/cache/apk/apkurl b/q-binding-query/unpackage/cache/apk/apkurl
new file mode 100644
index 0000000..9056f70
--- /dev/null
+++ b/q-binding-query/unpackage/cache/apk/apkurl
@@ -0,0 +1 @@
+https://ide.dcloud.net.cn/build/download/cb768fd0-3386-11ee-b8c2-7b3edfe28b45
\ No newline at end of file
diff --git a/q-binding-query/unpackage/cache/apk/cmManifestCache.json b/q-binding-query/unpackage/cache/apk/cmManifestCache.json
new file mode 100644
index 0000000..38774b2
--- /dev/null
+++ b/q-binding-query/unpackage/cache/apk/cmManifestCache.json
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/q-binding-query/unpackage/cache/certdata b/q-binding-query/unpackage/cache/certdata
new file mode 100644
index 0000000..4b9bfc7
--- /dev/null
+++ b/q-binding-query/unpackage/cache/certdata
@@ -0,0 +1,3 @@
+andrCertfile=D:/softwareData/OneDriver/OneDrive/桌面/HBuilderX/plugins/app-safe-pack/Test.keystore
+andrCertAlias=android
+andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==
diff --git a/q-binding-query/unpackage/cache/cloudcertificate/certini b/q-binding-query/unpackage/cache/cloudcertificate/certini
new file mode 100644
index 0000000..ad5c606
--- /dev/null
+++ b/q-binding-query/unpackage/cache/cloudcertificate/certini
@@ -0,0 +1,4 @@
+[General]
+andrCertfile=package.keystore
+andrCertAlias=__UNI__FC2D3D9
+andrCertPass="g+QF1eAtOtOVMf6hYsRrcg=="
diff --git a/q-binding-query/unpackage/cache/cloudcertificate/package.keystore b/q-binding-query/unpackage/cache/cloudcertificate/package.keystore
new file mode 100644
index 0000000..8df7756
Binary files /dev/null and b/q-binding-query/unpackage/cache/cloudcertificate/package.keystore differ
diff --git a/q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappautomator.js b/q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappautomator.js
new file mode 100644
index 0000000..e896209
--- /dev/null
+++ b/q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappautomator.js
@@ -0,0 +1,15 @@
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+function __spreadArrays(){for(var s=0,i=0,il=arguments.length;i]*>)(]*>[^<]*<\/span>)(.*?<\/uni-text>)/g,"$1$3").replace(/<\/?[^>]*>/g,(function(replacement){return-1":"