基于win注册表注册程序协议,你也能从网址调用程序带参。

丨你所具备能力

本教程综合难度为:(共10颗※)
您需要知道:Python语法基础。WEB开发基础。Qt库。win注册表编辑器。
如果您在学习的过程中,遇到困难,可以直接百度获取详细帮助,本文章不深入说明。

丨实例:腾讯QQ

丨丨链接

<召唤QQ音乐>
tencent://QQMusic/?uin=要召唤的QQ
<召唤多人聊天>
tencent://confhr/?subcmd=Start&fuin=要召唤的QQ&discname=房间名&user=设置自己昵称
<打开资料卡>
tencent://snsapp/?cmd=2&ver=1&uin=对方QQ&fuin=要召唤的QQ
<应该是进入对方的QT房间,没实际测试>
tencent://QTalk/?subcmd=Startup&account=对方QQ&roomid=0&fuin=要召唤的QQ
<弹出好友聊天窗口>
tencent://Message/?uin=对方QQ

丨丨效果

当在浏览器中打开这类链接,就会调用客户端,跳转到置顶界面。是不是很神奇呢?
具体就是碰到 tencent://… 时,自动调用 Timwp.exe,并把 tencent://… 地址作为第一个参数传递给 Timwp.exe。当然还他们还有mapi://,qqapi://等等。可以自定义。
那么我们也来搞一个吧!

丨效果图

在这里插入图片描述

丨网页

因为这是教程,我就用网页来输入编程猫的账号密码,然后传递到程序里获取用户数据。那具体的就是几个输入框加提交按钮,那么放上网页代码!

<!DOCTYPE html>
<html>
<head>
    <title>注册应用程序协议--冷鱼制作</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,dl,dt,dd,ol,nav ul,nav li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video,input{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;font-family:"Segoe UI","Lucida Grande",Helvetica,Arial,"Microsoft YaHei",FreeSans,Arimo,"Droid Sans","wenquanyi micro hei","Hiragino Sans GB","Hiragino Sans GB W3",FontAwesome,sans-serif}
        article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}ol,ul{list-style:none;margin:0;padding:0}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}a{text-decoration:none}img{max-width:100%}body{background-color:#0091e6}.main{margin:5em auto 0;width:22%}h1{font-size:2.4em;padding-bottom:28px;color:#fff;text-align:center}h2{font-size:1.5em;padding-bottom:28px;color:#0091e6;text-align:center}.login{padding:2em 0}.inset{position:relative;background:#fff;padding:2.5em;border-radius:.3em;-webkit-border-radius:.3em;-o-border-radius:.3em;-moz-border-radius:.3em;box-shadow:0 0 15px #545454}form span{display:block;font-size:1.0em;color:#333;font-weight:400}input[type="text"],input[type="password"]{padding:9px;width:93.4%;font-size:1.1em;margin:3px 0 25px;color:#666;background:#f0f0f0;border:0;font-weight:400;outline:0;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;border-radius:.2em;-webkit-border-radius:.2em;-o-border-radius:.2em;-moz-border-radius:.2em}input[type="text"]:hover,input[type="Password"]:hover,#active{border:0;outline:0}.sign{padding:10px 0 0;text-align:center}.submit{margin-right:11px;background:#0091e6;border:0;outline:0;padding:8px 30px;cursor:pointer;color:#FFF;font-size:.9em;border-radius:.3em;-webkit-border-radius:.3em;-moz-border-radius:.3em;-o-border-radius:.3em;transition:.5s all;-webkit-transition:.5s all;-moz-transition:.5s all;-o-transition:.5s all;font-weight:600;margin:0 auto}.submit:hover{background:#c5c5c5}.copy-right{text-align:center;width:97%;margin:10em auto 0}.copy-right p{color:#FFF;font-size:1em}.copy-right p a{font-size:1em;font-weight:600;color:#1567a5;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.copy-right p a:hover{color:#fff}@media(max-width:1440px){.main{width:25%}h1{font-size:2.2em}.copy-right{margin:5em auto 2em}}@media(max-width:1080px){.main{width:31%;margin:5em auto 0}.copy-right{width:97%;margin:3em auto 1em}}@media(max-width:1024px){.main{width:31%;margin:5em auto 0}.copy-right{width:97%;margin:3em auto 1em}}@media(max-width:991px){h1{font-size:2em}}@media(max-width:800px){.main{width:39%}}@media(max-width:768px){.main{width:42%;margin:11em auto 0}}@media(max-width:640px){.main{width:48%}h1{font-size:2.1em}}@media(max-width:600px){h1{font-size:2em}}@media(max-width:480px){.main{width:70%}}@media(max-width:320px){.main{width:95%;margin:1em auto 0}.copy-right{margin:1em auto 0}.inset{padding:2em}h1{font-size:1.9em}.login{padding:2em 0 0}}
    </style>
</head>
<body>
    <div class="main">
        <div class="login">
            <h1>bcmlogin://协议测试</h1>
            <div class="inset">
                <div>
                    <h2>编程猫参数传递</h2><span><label>编程猫账户:</label></span><span><input type="text" class="textbox" id="uid"></span>
                </div>
                <div><span><label>登录密码:</label></span><span><input type="password" class="password" id="pw"></span></div>
                <div class="sign"><input type="submit" value="使用客户端登录" class="submit" onclick="cs()" />
                    <script>
                        function cs(){location.href="bcmlogin://"+document.getElementById('uid').value+","+document.getElementById('pw').value;}
                    </script>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

从代码里面可以看到在

丨登录程序

我们先不急,我们先把程序搞定了,显然它是通过协议来传递参数的,也就是打开程序时候也带了一定的参数,我们在python里面,可以通过sys库来获取参数。

import sys
print(sys.argv)

然后我们运行一下,发现他打印出是列表,只有一个值:程序地址。那因为我们没有传递参数给他,所以就没有。只有一个地址。
经过打包后测试,我发现传递参数过来后,他就要两个值,第二个就是了。所以我们写成sys.argv[1]来得到我们的参数,建议加个try,避免程序出错。
那我们要实现登录程序,我们得写一个登录程序的代码吧?

import requests
sessionn = requests.Session()
headers = {"Content-Type": "application/json","User-Agent": "Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
url = "https://api.codemao.cn/tiger/v3/web/accounts/login"
session = sessionn.post(url, headers=headers, data=dumps({"identity": xxxxxxxxx, "password": xxxxxxx, "pid": "65edCTyg"}))

通过我的测试,我们需要把参数给分割,然后再赋值给data。就可以实现登录了。

try:
	gpus = sys.argv[1].split(',')
    user = gpus[0].split('//')[1]
    password = gpus[1][0:len(gpus[1])-1]
except:
	QMessageBox.warning(self, "登入失败,注意!", "参数缺失!请检查您是否账号密码填写完整!")

那么我的完整单页代码是这样的:

from PySide2.QtWidgets import *
from xy import Ui_MainWindow
import sys
import requests
from json import loads, dumps
class xyy(QMainWindow,  Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        try:
            gpus = sys.argv[1].split(',')
        except:
            QMessageBox.warning(self, "登入失败,注意!", "参数缺失!请检查您是否账号密码填写完整!")
        sessionn = requests.Session()
        headers = {"Content-Type": "application/json",
                   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
        url = "https://api.codemao.cn/tiger/v3/web/accounts/login"
        session = sessionn.post(url, headers=headers, data=dumps(
            {"identity": gpus[0].split('//')[1], "password": gpus[1][0:len(gpus[1])-1], "pid": "65edCTyg"}))
        if session.status_code == 200:
            user = requests.get("https://api.codemao.cn/web/users/details",
                                headers=headers, cookies=session.cookies.get_dict())
            user = loads(user.text)
            self.textBrowser.setText("获取到参数:"+str(sys.argv[1])+"\n您的uid:{0}\n您的昵称:{1}\n您的简介:{2}\n您的电话:{3}\n您的qq:{4}\n\n---------------------\n申明:如果您的程序是在冷鱼帖子中下载的请放心,如果您是在其他人链接下载的注意,别人很可能会篡改软件,获取您的密码!!本程序仅学习,请勿非法用".format(user['id'], user[
                'nickname'], user['description'], user['phone_number'], user['qq']))
        else:
            QMessageBox.warning(self, "登入失败,注意!", "请检查您传递的参数是否正确!通常是您输入的账号密码错误!")

#程序入口
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = xyy()
    sys.exit(app.exec_())

我使用了QT界面,文末附源码文件和注册文件。为了能更好的测试,我们可以用pyinstaller来打包程序,获得exe文件。

丨注册协议

重点来了,敲黑板!
我们想要实现用协议调用程序就要修改注册表,那么注册表修改错了容易导致计算机崩溃,我这里直接给.reg注册文件,修改一下内容就可以直接导入进去。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Bcmlogin]
@="bcmlogin"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\Bcmlogin\DefaultIcon]
@=""
[HKEY_CLASSES_ROOT\Bcmlogin\shell]
@=""
[HKEY_CLASSES_ROOT\Bcmlogin\shell\open]
@=""
[HKEY_CLASSES_ROOT\Bcmlogin\shell\open\command]
@="\"C:\\Users\\Administrator\\Desktop\\1.exe\" \"%1\""

通过上方内容,显然,bcmlogin就是协议名称,最下方的command的就是程序路径,就是自己的程序了,当然每隔电脑放置的程序地址不同,需要你手动修改,注意,地址要使用双斜杠哦。还有"是转义字符,请不要删除\。不然会失败。
如果你已经把程序改为你打包出来的那个程序就完事了,修改一下协议名称。
那么,保存吧!然后双击程序,导入到注册表。

丨测试

导入后,我们随便打开一个浏览器,输入自己的协议试试看看能否调用,比如在地址栏输入bcmlogin://。发现有反应了。那我们就试试用网页来传递参数吧!
我是设置的bcmlogin://账号,密码,其中我是用,(英文逗号)隔开的,我可以用分隔符来截取。
在这里插入图片描述

我们发现,的确是可以实现这种效果的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值