bak
BIN
10.GO-CQHTTP下载和运行.assets/image-20240616201445228.png
Normal file
After Width: | Height: | Size: 253 KiB |
BIN
10.GO-CQHTTP下载和运行.assets/image-20240616201653395.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
10.GO-CQHTTP下载和运行.assets/image-20240616201704561.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
10.GO-CQHTTP下载和运行.assets/image-20240616201755762.png
Normal file
After Width: | Height: | Size: 36 KiB |
24
10.GO-CQHTTP下载和运行.md
Normal 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)
|
||||
|
||||
输入你需要的序号,按下回车,就会生成配置文件
|
||||
|
||||
|
||||
|
BIN
11.签名服务器下载与搭建.assets/image-20240616202546716.png
Normal file
After Width: | Height: | Size: 81 KiB |
15
11.签名服务器下载与搭建.md
Normal file
@ -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)
|
||||
|
||||
添加一个启动列表,端口不要和其他程序冲突了。
|
||||
|
||||
添加后右击启动
|
BIN
12.QQ信息配置与登录.assets/image-20240616202842810.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
12.QQ信息配置与登录.assets/image-20240616203000090.png
Normal file
After Width: | Height: | Size: 197 KiB |
BIN
12.QQ信息配置与登录.assets/image-20240616203513219.png
Normal file
After Width: | Height: | Size: 263 KiB |
BIN
12.QQ信息配置与登录.assets/image-20240616203811438.png
Normal file
After Width: | Height: | Size: 172 KiB |
BIN
12.QQ信息配置与登录.assets/image-20240616204239564.png
Normal file
After Width: | Height: | Size: 19 KiB |
26
12.QQ信息配置与登录.md
Normal 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安装了这个
|
||||
|
@ -1,3 +1,7 @@
|
||||
# Bot-CQBOT
|
||||
|
||||
机器人:基于CQ-HTTP的QQ机器人
|
||||
机器人:基于CQ-HTTP的QQ机器人
|
||||
|
||||
注意:由于现在(2024年7月)只要一登录QQ机器人,很快就会封号,风险太大,我已经不再维护该项目。
|
||||
|
||||
各位同志也另谋出路,不要使用这种办法了
|
111
config.yml
Normal 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
@ -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
@ -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
8
python-apiproject/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# 默认忽略的文件
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# 基于编辑器的 HTTP 客户端请求
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
23
python-apiproject/.idea/API.iml
Normal 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>
|
@ -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>
|
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
7
python-apiproject/.idea/misc.xml
Normal 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>
|
8
python-apiproject/.idea/modules.xml
Normal 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>
|
6
python-apiproject/.idea/vcs.xml
Normal 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>
|
60
python-apiproject/NOTAPI/get_user_tel_address/index.py
Normal 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()
|
9
python-apiproject/NOTAPI/get_user_tel_by_qq/ces.py
Normal 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({"姓名":"小明"})["年龄"])
|
79
python-apiproject/NOTAPI/get_user_tel_by_qq/mycode.py
Normal 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("完毕!")
|
||||
# # #
|
||||
#
|
86
python-apiproject/NOTAPI/get_user_tel_by_qq/mycode_many.py
Normal 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("完毕!")
|
||||
# # #
|
||||
#
|
@ -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()
|
84
python-apiproject/NOTAPI/get_user_tel_by_qq/readme.md
Normal 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
|
41
python-apiproject/OpenCVTool/README.md
Normal 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:输出路径
|
||||
|
85
python-apiproject/OpenCVTool/__init__.py
Normal 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}}
|
||||
#
|
54
python-apiproject/OpenCVTool/img_zip.py
Normal 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.
|
||||
# #
|
||||
# # 对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.
|
||||
# # 判断文件是否存在,存在则返回成功,失败则返回失败
|
||||
#
|
12
python-apiproject/Readme.md
Normal file
@ -0,0 +1,12 @@
|
||||
## API服务
|
||||
|
||||
使用Python后端实现的API服务项目,建设通用API,供其他项目使用,避免重复造轮子。
|
||||
|
||||
【UPDATE】2023年9月4日
|
||||
* [新增] 图片压缩接口
|
||||
|
||||
【UPDATE】2023年8月5日
|
||||
|
||||
* [新增]通过QQ查询电话号码的API
|
||||
* [进行中]动态加密令牌生成与查询API
|
||||
* [待处理]邮件发送接口 当前邮件发送代码格式不符合规范
|
69
python-apiproject/__init__.py
Normal file
@ -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都可访问
|
13
python-apiproject/dynamic_toekn/Readme.md
Normal file
@ -0,0 +1,13 @@
|
||||
# 动态令牌
|
||||
|
||||
本区域提供动态令牌生成与查询功能,目前主要是为了避免接口滥用
|
||||
|
||||
此项目部分接口将会采用动态令牌来确保无权限人员不能请求接口
|
||||
|
||||
## 算法
|
||||
|
||||
为了能满足多个项目的需求,本区域动态令牌生成方式将会实现多种算法以供选择
|
||||
|
||||
## 存储
|
||||
|
||||
令牌存储通过MongoDB存储,字段包括id,令牌,生成时间,备注
|
4
python-apiproject/dynamic_toekn/__init__.py
Normal file
@ -0,0 +1,4 @@
|
||||
import json
|
||||
import requests
|
||||
from flask import request, Blueprint
|
||||
API_DyNamicToken = Blueprint("API_DyNamicToken", __name__)
|
13
python-apiproject/dynamic_toekn/key_create.py
Normal 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()))
|
24
python-apiproject/dynamic_toekn/token_create.py
Normal 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')
|
1
python-apiproject/index.bat
Normal file
@ -0,0 +1 @@
|
||||
pip3 freeze requirements.txt
|
97
python-apiproject/oemail/__init__.py
Normal file
@ -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 = """
|
||||
<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, "提示": "没有权限"} # 无权限操作
|
||||
|
||||
|
182
python-apiproject/package_info/__init__.py
Normal 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": {}}
|
0
python-apiproject/requirements.txt
Normal file
89
python-apiproject/templates/404.html
Normal 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>
|
89
python-apiproject/templates/500.html
Normal 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>
|
81
python-apiproject/templates/document.html
Normal 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>
|
89
python-apiproject/templates/index.html
Normal 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>
|
194
python-apiproject/templates/info/qq.html
Normal 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>
|
||||
"code":1,<br>
|
||||
"message":"相关消息",<br>
|
||||
"data":{<br>
|
||||
"qq":"QQ账号",<br>
|
||||
"tel":"手机号码",<br>
|
||||
"id":"微博id",<br>
|
||||
"address":"手机号归属地"<br>
|
||||
}<br>
|
||||
}<br>
|
||||
</code>
|
||||
</p>
|
||||
<p class="text">
|
||||
<span class="tag_yellow">失败</span>
|
||||
<br><br>
|
||||
<code>
|
||||
{<br>
|
||||
"code":"相关失败代码,一般是-1",<br>
|
||||
"message":"失败原因",<br>
|
||||
"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>
|
31
python-apiproject/请求证书.txt
Normal 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
@ -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>
|
7
q-binding-query/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# 查询Q绑手机号
|
||||
|
||||
Uni-app程序,支持编译为小程序、app、网页
|
||||
|
||||
本仓库只包含前端内容
|
||||
|
||||
业务后端有Python API项目提供
|
38
q-binding-query/androidPrivacy.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
21
q-binding-query/index.html
Normal 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
@ -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
|
125
q-binding-query/manifest.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
26
q-binding-query/pages.json
Normal file
@ -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": {}
|
||||
}
|
143
q-binding-query/pages/index/index.vue
Normal 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>
|
64
q-binding-query/pages/info/InfoFromQQ/InfoFromQQ.vue
Normal 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>
|
BIN
q-binding-query/static/LOGO.png
Normal file
After Width: | Height: | Size: 36 KiB |
10
q-binding-query/uni.promisify.adaptor.js
Normal 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
@ -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;
|
BIN
q-binding-query/unpackage/cache/apk/__UNI__FC2D3D9_cm.apk
vendored
Normal file
1
q-binding-query/unpackage/cache/apk/apkurl
vendored
Normal file
@ -0,0 +1 @@
|
||||
https://ide.dcloud.net.cn/build/download/cb768fd0-3386-11ee-b8c2-7b3edfe28b45
|
1
q-binding-query/unpackage/cache/apk/cmManifestCache.json
vendored
Normal file
3
q-binding-query/unpackage/cache/certdata
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
andrCertfile=D:/softwareData/OneDriver/OneDrive/桌面/HBuilderX/plugins/app-safe-pack/Test.keystore
|
||||
andrCertAlias=android
|
||||
andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==
|
4
q-binding-query/unpackage/cache/cloudcertificate/certini
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
[General]
|
||||
andrCertfile=package.keystore
|
||||
andrCertAlias=__UNI__FC2D3D9
|
||||
andrCertPass="g+QF1eAtOtOVMf6hYsRrcg=="
|
BIN
q-binding-query/unpackage/cache/cloudcertificate/package.keystore
vendored
Normal file
15
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappautomator.js
vendored
Normal file
32
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappchooselocation.js
vendored
Normal file
BIN
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniapperror.png
vendored
Normal file
After Width: | Height: | Size: 5.7 KiB |
32
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappopenlocation.js
vendored
Normal file
33
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniapppicker.js
vendored
Normal file
8
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappquill.js
vendored
Normal file
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappquillimageresize.js
vendored
Normal file
32
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappscan.js
vendored
Normal file
BIN
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappsuccess.png
vendored
Normal file
After Width: | Height: | Size: 2.0 KiB |
23
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/__uniappview.html
vendored
Normal 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>
|
38
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/androidPrivacy.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
11
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/app-config-service.js
vendored
Normal 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}}}});
|
||||
})();
|
||||
|
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/app-config.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(function(){})();
|
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/app-service.js
vendored
Normal 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);
|
3
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/app.css
vendored
Normal file
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/manifest.json
vendored
Normal 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"}
|
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/pages/index/index.css
vendored
Normal 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}
|
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/pages/info/InfoFromQQ/InfoFromQQ.css
vendored
Normal 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}
|
BIN
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/static/LOGO.png
vendored
Normal file
After Width: | Height: | Size: 36 KiB |
1
q-binding-query/unpackage/cache/wgt/__UNI__FC2D3D9/uni-app-view.umd.js
vendored
Normal file
BIN
q-binding-query/unpackage/release/apk/萌狼工作室_查询QQ绑定的手机号.apk
Normal file
BIN
q-binding-query/unpackage/res/icons/1024x1024.png
Normal file
After Width: | Height: | Size: 407 KiB |
BIN
q-binding-query/unpackage/res/icons/120x120.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
q-binding-query/unpackage/res/icons/144x144.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
q-binding-query/unpackage/res/icons/152x152.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
q-binding-query/unpackage/res/icons/167x167.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
q-binding-query/unpackage/res/icons/180x180.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
q-binding-query/unpackage/res/icons/192x192.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
q-binding-query/unpackage/res/icons/20x20.png
Normal file
After Width: | Height: | Size: 999 B |
BIN
q-binding-query/unpackage/res/icons/29x29.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
q-binding-query/unpackage/res/icons/40x40.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
q-binding-query/unpackage/res/icons/58x58.png
Normal file
After Width: | Height: | Size: 5.2 KiB |