This commit is contained in:
萌狼蓝天 2024-07-06 09:47:19 +08:00
parent 4c200d288f
commit 7e283facb1
110 changed files with 2661 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -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)
输入你需要的序号,按下回车,就会生成配置文件

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -0,0 +1,15 @@
下载windowshttps://github.com/CikeyQi/unidbg-fetch-qsign-gui
下载Linuxhttps://github.com/CikeyQi/unidbg-fetch-qsign-shell
注意,官方原版已经停止维护,上述链接的不是原版。
注意该行为可能会导致QQ被封号谨慎使用
加载之后解压以管理员身份运行EXE
![image-20240616202546716](./11.签名服务器下载与搭建.assets/image-20240616202546716.png)
添加一个启动列表,端口不要和其他程序冲突了。
添加后右击启动

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -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安装了这个

View File

@ -1,3 +1,7 @@
# Bot-CQBOT
机器人基于CQ-HTTP的QQ机器人
注意由于现在2024年7月只要一登录QQ机器人很快就会封号风险太大我已经不再维护该项目。
各位同志也另谋出路,不要使用这种办法了

111
config.yml Normal file
View File

@ -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 时立即

37
device.json Normal file
View File

@ -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"
}

2
go-cqhttp.bat Normal file
View File

@ -0,0 +1,2 @@
%Created by go-cqhttp. DO NOT EDIT ME!%
start cmd /K "go-cqhttp_windows_386.exe"

BIN
go-cqhttp_windows_386.exe Normal file

Binary file not shown.

8
python-apiproject/.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="Flask">
<option name="enabled" value="true" />
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="flask311" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Jinja2" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/templates" />
</list>
</option>
</component>
</module>

View File

@ -0,0 +1,24 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="MySQL-python" />
<item index="1" class="java.lang.String" itemvalue="pycryptodome" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N803" />
<option value="N802" />
</list>
</option>
</inspection_tool>
</profile>
</component>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="flask311" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="flask311" project-jdk-type="Python SDK" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/API.iml" filepath="$PROJECT_DIR$/.idea/API.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -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()

View File

@ -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({"姓名":"小明"})["年龄"])

View File

@ -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("完毕!")
# # #
#

View File

@ -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("完毕!")
# # #
#

View File

@ -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()

View File

@ -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

View File

@ -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输出路径

View File

@ -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}}
#

View File

@ -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.
# #
# # 对于PPMPGM或PBM格式的图片这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY)取值为0或1而默认值为1.
# # 判断文件是否存在,存在则返回成功,失败则返回失败
#

View File

@ -0,0 +1,12 @@
## API服务
使用Python后端实现的API服务项目建设通用API供其他项目使用避免重复造轮子。
【UPDATE】2023年9月4日
* [新增] 图片压缩接口
【UPDATE】2023年8月5日
* [新增]通过QQ查询电话号码的API
* [进行中]动态加密令牌生成与查询API
* [待处理]邮件发送接口 当前邮件发送代码格式不符合规范

View File

@ -0,0 +1,69 @@
# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客Https://mllt.cc
# 笔记Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间2022/5/6
# CodingUTF-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都可访问

View File

@ -0,0 +1,13 @@
# 动态令牌
本区域提供动态令牌生成与查询功能,目前主要是为了避免接口滥用
此项目部分接口将会采用动态令牌来确保无权限人员不能请求接口
## 算法
为了能满足多个项目的需求,本区域动态令牌生成方式将会实现多种算法以供选择
## 存储
令牌存储通过MongoDB存储字段包括id令牌生成时间备注

View File

@ -0,0 +1,4 @@
import json
import requests
from flask import request, Blueprint
API_DyNamicToken = Blueprint("API_DyNamicToken", __name__)

View File

@ -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()))

View File

@ -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')

View File

@ -0,0 +1 @@
pip3 freeze requirements.txt

View File

@ -0,0 +1,97 @@
# -*- coding: UTF-8 -*-
# 开发人员:萌狼蓝天
# 博客Https://mllt.cc
# 笔记Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号:萌狼蓝天
# 开发时间2022/5/6
# CodingUTF-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 = """
<p>[萌狼工作室]操作验证您的验证码为</p>
<h1>{}<h1>
<p>验证码10分钟内有效</p>
<p>如果这不是你自己操作获得的邮件忽略即可</p>
<small>本邮件自动发送无需回复</small>
""".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, "提示": "没有权限"} # 无权限操作

View File

@ -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": {}}

View File

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Page Not Found</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
text-align: center;
}
.box {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.number {
font-size: 80px;
color: #666;
font-weight: bold;
}
.text {
font-size: 14px;
margin: 24px;
color: #333;
}
.btn-container {
display: flex;
justify-content: center;
}
.btn {
padding: 8px 24px;
display: inline-block;
text-decoration: none;
background: #fff;
border: 2px solid #efefef;
color: #333;
margin: 24px;
border-radius: 20px;
cursor: pointer;
display: flex;
align-items: center;
}
.footer {
padding: 16px;
border-top: 1px solid #efefef;
color: #777;
font-weight: lighter;
}
.footer a {
text-decoration: none;
font-weight: bold;
color: #000;
}
</style>
</head>
<body>
<div class="box">
<div class="number">4 0 4</div>
<div class="text">
Page not found
</div>
<div class="btn-container">
<a class="btn" id="back">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" style="margin-right: 8px;">
<path fill="none" d="M0 0h24v24H0z"/>
<path d="M5.828 7l2.536 2.536L6.95 10.95 2 6l4.95-4.95 1.414 1.414L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 1 0 0-12H5.828z"/>
</svg>
Back
</a>
</div>
</div>
<footer class="footer">
Powered by <a href="https://mllt.cc" target="_blank">萌狼工作室</a>
</footer>
<script>
var back = document.getElementById('back')
back.onclick = function() { console.log('run...'); history.back() }
</script>
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>萌狼工作室 Error-500</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
text-align: center;
}
.box {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.number {
font-size: 80px;
color: #666;
font-weight: bold;
}
.text {
font-size: 14px;
margin: 24px;
color: #333;
}
.btn-container {
display: flex;
justify-content: center;
}
.btn {
padding: 8px 24px;
display: inline-block;
text-decoration: none;
background: #fff;
border: 2px solid #efefef;
color: #333;
margin: 24px;
border-radius: 20px;
cursor: pointer;
display: flex;
align-items: center;
}
.footer {
padding: 16px;
border-top: 1px solid #efefef;
color: #777;
font-weight: lighter;
}
.footer a {
text-decoration: none;
font-weight: bold;
color: #000;
}
</style>
</head>
<body>
<div class="box">
<div class="number">500</div>
<div class="text">
Oh……Maybe the website was
</div>
<div class="btn-container">
<a class="btn" id="back">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" style="margin-right: 8px;">
<path fill="none" d="M0 0h24v24H0z"/>
<path d="M5.828 7l2.536 2.536L6.95 10.95 2 6l4.95-4.95 1.414 1.414L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 1 0 0-12H5.828z"/>
</svg>
Back
</a>
</div>
</div>
<footer class="footer">
Powered by <a href="https://mllt.cc" target="_blank">萌狼工作室</a>
</footer>
<script>
var back = document.getElementById('back')
back.onclick = function() { console.log('run...'); history.back() }
</script>
</body>
</html>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>萌狼工作室</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
text-align: center;
}
.box {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.number {
font-size: 32px;
color: #666;
font-weight: bold;
}
.text {
font-size: 14px;
margin: 24px;
color: #333;
}
.btn-container {
display: flex;
justify-content: center;
}
.btn {
padding: 8px 24px;
display: inline-block;
text-decoration: none;
background: #fff;
border: 2px solid #efefef;
color: #333;
margin: 24px;
border-radius: 20px;
cursor: pointer;
display: flex;
align-items: center;
}
.footer {
padding: 16px;
border-top: 1px solid #efefef;
color: #777;
font-weight: lighter;
}
.footer a {
text-decoration: none;
font-weight: bold;
color: #000;
}
</style>
</head>
<body>
<div class="box">
<div class="number">萌狼工作室 - 接口文档</div>
<div class="text">
Oh!Why you know this page?!
</div>
<div class="btn-container">
<a class="btn" id="back" href="/docs/qq">
QQ信息查询接口
</a>
</div>
</div>
<footer class="footer">
Powered by <a href="https://cnblogs.com/mllt" target="_blank">萌狼工作室</a>
</footer>
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>萌狼工作室</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
text-align: center;
}
.box {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.number {
font-size: 80px;
color: #666;
font-weight: bold;
}
.text {
font-size: 14px;
margin: 24px;
color: #333;
}
.btn-container {
display: flex;
justify-content: center;
}
.btn {
padding: 8px 24px;
display: inline-block;
text-decoration: none;
background: #fff;
border: 2px solid #efefef;
color: #333;
margin: 24px;
border-radius: 20px;
cursor: pointer;
display: flex;
align-items: center;
}
.footer {
padding: 16px;
border-top: 1px solid #efefef;
color: #777;
font-weight: lighter;
}
.footer a {
text-decoration: none;
font-weight: bold;
color: #000;
}
</style>
</head>
<body>
<div class="box">
<div class="number">萌狼工作室</div>
<div class="text">
The website has nothing. Where did you come from, where go back!
</div>
<div class="btn-container">
<a class="btn" id="back">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" style="margin-right: 8px;">
<path fill="none" d="M0 0h24v24H0z"/>
<path d="M5.828 7l2.536 2.536L6.95 10.95 2 6l4.95-4.95 1.414 1.414L5.828 5H13a8 8 0 1 1 0 16H4v-2h9a6 6 0 1 0 0-12H5.828z"/>
</svg>
Back
</a>
</div>
</div>
<footer class="footer">
Powered by <a href="https://cnblogs.com/mllt" target="_blank">萌狼工作室</a>
</footer>
<script>
var back = document.getElementById('back')
back.onclick = function() { console.log('run...'); window.location.href="https://space.bilibili.com/104330271"; }
</script>
</body>
</html>

View File

@ -0,0 +1,194 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>萌狼工作室</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
text-align: center;
}
.box {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
}
.info {
width: 80%;
max-width: 350px;
text-align: left;
box-sizing: border-box;
padding: 10px;
margin: 1em auto;
box-shadow: 0 5px 10px 5px rgba(50, 60, 70, 0.2);
border-radius: 5px;
}
.number {
font-size: 3em;
color: #666;
font-weight: bold;
}
.text {
font-size: 14px;
margin: 24px;
color: #333;
}
.btn-container {
display: flex;
justify-content: center;
}
.btn {
padding: 8px 24px;
text-decoration: none;
background: #fff;
border: 2px solid #efefef;
color: #333;
margin: 12px;
border-radius: 20px;
cursor: pointer;
display: flex;
align-items: center;
}
.footer {
padding: 16px;
border-top: 1px solid #efefef;
color: #777;
font-weight: lighter;
}
.footer a {
text-decoration: none;
font-weight: bold;
color: #000;
}
.tag_red {
font-size: 12px;
color: white;
background: indianred;
padding: 2px;
box-sizing: border-box;
border-radius: 5px;
margin-right: 5px;
}
.tag_blue {
font-size: 12px;
color: white;
background: dodgerblue;
padding: 2px 8px;
box-sizing: border-box;
border-radius: 5px;
margin: 10px;
}
.tag_green {
font-size: 12px;
color: white;
background: lightseagreen;
padding: 2px 8px;
box-sizing: border-box;
border-radius: 5px;
margin: 10px;
}
.tag_yellow {
font-size: 12px;
color: indianred;
background: #f3f394;
padding: 2px 8px;
box-sizing: border-box;
border-radius: 5px;
margin: 10px;
}
.link {
border-bottom: 1px dotted #000;
}
.info:hover .link {
color: indianred;
}
</style>
</head>
<body>
<div class="box">
<div class="number">萌狼工作室</div>
<div class="btn-container">
<a class="btn" id="back" href="/doc">
返回
</a>
</div>
<div class="text">
信息查询接口 <br><br>通过QQ账号查询所绑定的手机号、手机号归属地、微博id<br>
该接口随时可能失效,如果失效了请联系萌狼蓝天<br>(去哔哩哔哩/CSDN 私信 萌狼蓝天)
</div>
<div class="info">
<p><span class="tag_red">POST</span><span class="link">http://api.mllt.cc/apis/info/qq</span></p>
<hr style="margin: 0.5em auto">
<span class="tag_red">参数</span><br>
<p class="text">
<span class="tag_blue">qq</span><span>QQ账号支持多个QQ账号查询账号之间使用左斜杠 / 隔开</span></p>
<hr style="margin: 0.5em auto">
<span class="tag_red">返回值</span><br>
<p class="text">
<span class="tag_green">成功</span>
<br><br>
<code>
{<br>
&nbsp;"code":1,<br>
&nbsp;"message":"相关消息",<br>
&nbsp;"data":{<br>
&nbsp;&nbsp;"qq":"QQ账号",<br>
&nbsp;&nbsp;"tel":"手机号码"<br>
&nbsp;&nbsp;"id":"微博id",<br>
&nbsp;&nbsp;"address":"手机号归属地"<br>
&nbsp;}<br>
}<br>
</code>
</p>
<p class="text">
<span class="tag_yellow">失败</span>
<br><br>
<code>
{<br>
&nbsp;"code":"相关失败代码,一般是-1",<br>
&nbsp;"message":"失败原因",<br>
&nbsp;"data":{}<br>
}<br>
</code>
</p>
</div>
</div>
<footer class="footer">
Powered by <a href="https://cnblogs.com/mllt" target="_blank">萌狼工作室</a>
</footer>
<script>
var back = document.getElementById('back')
back.onclick = function () {
console.log('run...');
window.location.href = "https://space.bilibili.com/104330271";
}
</script>
</body>
</html>

View File

@ -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

27
q-binding-query/App.vue Normal file
View File

@ -0,0 +1,27 @@
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
uni-page-head { display: none; }
html,body{
margin: 0;
padding: 0;
}
.mh_liti{
box-shadow: 0 3px 10px 5px rgba(100, 100, 100, 0.2);
border-radius: 10rpx;
}
</style>

View File

@ -0,0 +1,7 @@
# 查询Q绑手机号
Uni-app程序支持编译为小程序、app、网页
本仓库只包含前端内容
业务后端有Python API项目提供

View File

@ -0,0 +1,38 @@
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept": "同意并接受",
"buttonRefuse": "暂不同意",
"hrefLoader": "system|default",
"backToExit":"false",
"second": {
"title": "确认提示",
"message": "  进入应用前,你需先同意<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>,否则将退出应用。",
"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"
}
}
}

View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<link rel="shortcut icon" href="./static/LOGO.png" type="image/x-icon">
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

22
q-binding-query/main.js Normal file
View File

@ -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

View File

@ -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" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"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"
}
}
}

View File

@ -0,0 +1,26 @@
{
"pages": [ //pageshttps://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": {}
}

View File

@ -0,0 +1,143 @@
<template>
<div>
<br>
<div style="max-width: 350px;margin: 0 auto;">
<input type="text" placeholder="请输入QQ账号" v-model="qq" class="mh_liti" style="width:80%;height:2.5em;margin: 1em auto;padding:2px 2px 2px 1em;box-sizing: border-box;">
<button style="width:80%;height:2.5em;margin: 1em auto;box-sizing: border-box;" @click="search" :disabled="wait">{{btnTitle}}</button>
</div>
<view class="content">
<div class="item" v-for="(item,index) in datas" :key="index">
<info-from-q-q-vue :qq="item['qq']" :tel="item['tel']" :wb="item['id']" :address="item['address']" :url="'https://q1.qlogo.cn/g?b=qq&nk='+item['qq']+'&s=640'"></info-from-q-q-vue>
</div>
</view>
<p style="text-align: center;color: darkgray;">批量查询业务请联系哔哩哔哩萌狼蓝天</p>
<p style="text-align: center;color: darkgray;">查询失效请联系萌狼蓝天进行维护</p>
<p style="text-align: center;color: darkgray;">返回结果为无则是未查询到</p>
<p style="text-align: center;color: darkgray;">最后一次更新2023-08-05</p>
</div>
</template>
<script>
import InfoFromQQVue from '../info/InfoFromQQ/InfoFromQQ.vue'
export default {
components:{
InfoFromQQVue,
},
data() {
return {
qq: '',
that:this,
datas:[],
wait:false,
btnTitle:'查询'
}
},
onLoad() {
// console.log(this)
},
methods: {
search(){
this.wait=true
this.btnTitle="查询中"
console.log(this.qq)
if(this.qq===""){
uni.showToast({
title: '请输入正确的QQ号',
// success icon
icon: 'none',
// 2
duration: 2000
})
this.wait=false
this.btnTitle="查询"
return false
}else{
console.log(this.qq)
}
uni.request({
url:'http://124.71.108.214:2312//apis/info/qq',
method:"POST",
'headers': {
'content-type': 'application/x-www-form-urlencoded'
},
data:{
"qq":this.qq
},
success: (res) => {
this.datas=[]
console.log("success:",res["data"])
let data = res["data"]
console.log("获取数据",data)
console.log("code",data["code"])
if(data["code"]===1){
let result = data["data"]
//
if(this.qq.includes("/")){
//
this.datas = result
}else{
//
this.datas.push(result)
}
console.log("最终数据:",this.datas)
}
},
fail: (err) => {
console.log("err",err)
},
complete: () => {
this.wait=false
this.btnTitle="查询"
}
})
var options = {
'method': 'POST',
'url': 'http://api.mllt.cc/apis/info/qq?qq='+this.qq,
};
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: ow- reverse;/*主轴*/
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
.item{
}
/*
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
} */
</style>

View File

@ -0,0 +1,64 @@
<template>
<div class="box_info mh_liti">
<div class="box_inline box_inline_l">
<image :src="url" class="mh_liti profile"></image>
</div>
<div class="box_inline box_inline_r" >
<p>Q Q {{qq}}</p>
<p>手机{{tel}}</p>
<p> {{address}}</p>
<p> ID{{wb}}</p>
</div>
</div>
</template>
<script>
export default {
props:{
qq:String,
vQQProfile:String,
tel:String,
address:String,
wb:String,
url:String
},
methods: {
},
mounted() {
// console.log(this.url)
}
}
</script>
<style>
.profile {
/* height: 250rpx; */
/* width: 250rpx; */
width: 100px;
height: 100px;
/* margin-top: 50rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 25rpx; */
}
.box_info{
margin: 1em;
max-width: 350px;
display: flex;
text-align: left;
padding: 10px;
box-sizing: border-box;
}
.box_inline{
margin-top: 10rpx;
margin-bottom: 10rpx;
}
.box_inline_l{
width: 100px;
}
.box_inline_r{
margin-left: 1em;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -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]));
});
},
});

76
q-binding-query/uni.scss Normal file
View File

@ -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;

Binary file not shown.

View File

@ -0,0 +1 @@
https://ide.dcloud.net.cn/build/download/cb768fd0-3386-11ee-b8c2-7b3edfe28b45

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
andrCertfile=D:/softwareData/OneDriver/OneDrive/桌面/HBuilderX/plugins/app-safe-pack/Test.keystore
andrCertAlias=android
andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==

View File

@ -0,0 +1,4 @@
[General]
andrCertfile=package.keystore
andrCertAlias=__UNI__FC2D3D9
andrCertPass="g+QF1eAtOtOVMf6hYsRrcg=="

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

View File

@ -0,0 +1,38 @@
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept": "同意并接受",
"buttonRefuse": "暂不同意",
"hrefLoader": "system|default",
"backToExit":"false",
"second": {
"title": "确认提示",
"message": "  进入应用前,你需先同意<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>,否则将退出应用。",
"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"
}
}
}

View File

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"Why Not Fly —— 萌狼蓝天","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"查询QQ绑定手机","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"3.8.7","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"fallbackLocale":"zh-Hans","locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"navigationBar":{"titleText":"查询QQ绑定的手机","type":"default"},"isNVue":false}},{"path":"pages/info/InfoFromQQ/InfoFromQQ","meta":{"enablePullDownRefresh":false,"navigationBar":{"titleText":"","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

View File

@ -0,0 +1 @@
(function(){})();

View File

@ -0,0 +1 @@
if("undefined"==typeof Promise||Promise.prototype.finally||(Promise.prototype.finally=function(e){const t=this.constructor;return this.then((n=>t.resolve(e()).then((()=>n))),(n=>t.resolve(e()).then((()=>{throw n}))))}),"undefined"!=typeof uni&&uni&&uni.requireGlobal){const e=uni.requireGlobal();ArrayBuffer=e.ArrayBuffer,Int8Array=e.Int8Array,Uint8Array=e.Uint8Array,Uint8ClampedArray=e.Uint8ClampedArray,Int16Array=e.Int16Array,Uint16Array=e.Uint16Array,Int32Array=e.Int32Array,Uint32Array=e.Uint32Array,Float32Array=e.Float32Array,Float64Array=e.Float64Array,BigInt64Array=e.BigInt64Array,BigUint64Array=e.BigUint64Array}uni.restoreGlobal&&uni.restoreGlobal(Vue,weex,plus,setTimeout,clearTimeout,setInterval,clearInterval),function(e){"use strict";function t(e,t,...n){uni.__log__?uni.__log__(e,t,...n):console[e].apply(console,[...n,t])}const n=(e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n};const r=n({props:{qq:String,vQQProfile:String,tel:String,address:String,wb:String,url:String},methods:{},mounted(){}},[["render",function(t,n,r,i,o,a){return e.openBlock(),e.createElementBlock("div",{class:"box_info mh_liti"},[e.createElementVNode("div",{class:"box_inline box_inline_l"},[e.createElementVNode("image",{src:r.url,class:"mh_liti profile"},null,8,["src"])]),e.createElementVNode("div",{class:"box_inline box_inline_r"},[e.createElementVNode("p",null,"Q Q "+e.toDisplayString(r.qq),1),e.createElementVNode("p",null,"手机:"+e.toDisplayString(r.tel),1),e.createElementVNode("p",null,"归 属 地:"+e.toDisplayString(r.address),1),e.createElementVNode("p",null,"微 博 ID"+e.toDisplayString(r.wb),1)])])}]]);__definePage("pages/index/index",n({components:{InfoFromQQVue:r},data(){return{qq:"",that:this,datas:[],wait:!1,btnTitle:"查询"}},onLoad(){},methods:{search(){if(this.wait=!0,this.btnTitle="查询中",t("log","at pages/index/index.vue:47",this.qq),""===this.qq)return uni.showToast({title:"请输入正确的QQ号",icon:"none",duration:2e3}),this.wait=!1,this.btnTitle="查询",!1;t("log","at pages/index/index.vue:60",this.qq),uni.request({url:"http://124.71.108.214:2312//apis/info/qq",method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},data:{qq:this.qq},success:e=>{this.datas=[],t("log","at pages/index/index.vue:73","success:",e.data);let n=e.data;if(t("log","at pages/index/index.vue:75","获取数据",n),t("log","at pages/index/index.vue:76","code",n.code),1===n.code){let e=n.data;this.qq.includes("/")?this.datas=e:this.datas.push(e),t("log","at pages/index/index.vue:87","最终数据:",this.datas)}},fail:e=>{t("log","at pages/index/index.vue:92","err",e)},complete:()=>{this.wait=!1,this.btnTitle="查询"}}),this.qq}}},[["render",function(t,n,r,i,o,a){const l=e.resolveComponent("info-from-q-q-vue");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("br"),e.createElementVNode("div",{style:{"max-width":"350px",margin:"0 auto"}},[e.withDirectives(e.createElementVNode("input",{type:"text",placeholder:"请输入QQ账号","onUpdate:modelValue":n[0]||(n[0]=e=>o.qq=e),class:"mh_liti",style:{width:"80%",height:"2.5em",margin:"1em auto",padding:"2px 2px 2px 1em","box-sizing":"border-box"}},null,512),[[e.vModelText,o.qq]]),e.createElementVNode("button",{style:{width:"80%",height:"2.5em",margin:"1em auto","box-sizing":"border-box"},onClick:n[1]||(n[1]=(...e)=>a.search&&a.search(...e)),disabled:o.wait},e.toDisplayString(o.btnTitle),9,["disabled"])]),e.createElementVNode("view",{class:"content"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.datas,((t,n)=>(e.openBlock(),e.createElementBlock("div",{class:"item",key:n},[e.createVNode(l,{qq:t.qq,tel:t.tel,wb:t.id,address:t.address,url:"https://q1.qlogo.cn/g?b=qq&nk="+t.qq+"&s=640"},null,8,["qq","tel","wb","address","url"])])))),128))]),e.createElementVNode("p",{style:{"text-align":"center",color:"darkgray"}},"批量查询业务请联系哔哩哔哩萌狼蓝天"),e.createElementVNode("p",{style:{"text-align":"center",color:"darkgray"}},"查询失效请联系萌狼蓝天进行维护"),e.createElementVNode("p",{style:{"text-align":"center",color:"darkgray"}},"返回结果为无则是未查询到"),e.createElementVNode("p",{style:{"text-align":"center",color:"darkgray"}},"最后一次更新2023-08-05")])}]])),__definePage("pages/info/InfoFromQQ/InfoFromQQ",r);const i={onLaunch:function(){t("log","at App.vue:4","App Launch")},onShow:function(){t("log","at App.vue:7","App Show")},onHide:function(){t("log","at App.vue:10","App Hide")}};const{app:o,Vuex:a,Pinia:l}={app:e.createVueApp(i)};uni.Vuex=a,uni.Pinia=l,o.provide("__globalStyles",__uniConfig.styles),o._component.mpType="app",o._component.render=()=>{},o.mount("#app")}(Vue);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__FC2D3D9","name":"查询QQ绑定手机","version":{"name":"1.0.0","code":"100"},"description":"查询QQ号所绑定的手机号","developer":{"name":"","email":"","url":""},"permissions":{"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"render":"always","id":"1","kernel":"WKWebview"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":"icon-android-hdpi.png","xhdpi":"icon-android-xhdpi.png","xxhdpi":"icon-android-xxhdpi.png","xxxhdpi":"icon-android-xxxhdpi.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"},"prerendered":"false"}},"splashscreen":{"useOriginalMsgbox":true},"google":{"abiFilters":["armeabi-v7a","arm64-v8a","x86"],"minSdkVersion":21,"permissions":["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-feature android:name=\"android.hardware.camera\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"],"packagename":"com.xrilang.lml","custompermissions":true},"apple":{"dSYMs":false,"devices":"universal"},"plugins":{"ad":{"ks":{},"ks-content":{},"sigmob":{}},"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}}},"orientation":"portrait-primary"},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#F8F8F8"},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"uni-app":{"control":"uni-v3","vueVersion":"3","compilerVersion":"3.8.7","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal","webView":{"minUserAgentVersion":"49.0"}},"adid":"127426170703"},"locale":"zh-Hans","launch_path":"__uniappview.html"}

View File

@ -0,0 +1 @@
.profile{width:100px;height:100px}.box_info{margin:1em;max-width:350px;display:flex;text-align:left;padding:10px;box-sizing:border-box}.box_inline{margin-top:.3125rem;margin-bottom:.3125rem}.box_inline_l{width:100px}.box_inline_r{margin-left:1em}.content{display:flex;flex-direction:ow- reverse;align-items:center;justify-content:center;flex-wrap:wrap}

View File

@ -0,0 +1 @@
.profile{width:100px;height:100px}.box_info{margin:1em;max-width:350px;display:flex;text-align:left;padding:10px;box-sizing:border-box}.box_inline{margin-top:.3125rem;margin-bottom:.3125rem}.box_inline_l{width:100px}.box_inline_r{margin-left:1em}

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Some files were not shown because too many files have changed in this diff Show More