首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
14,232 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,468 阅读
3
gradle-5.4.1-all.zip下载
9,509 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
8,203 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
7,019 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
617
篇文章
累计收到
629
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
452
篇与
的结果
2020-06-05
C# 可视化程序设计机试知识点汇总,DBhelper类代码
打开窗体HotelType ht = new HotelType(); ht.Show();//非模式窗体 ht.ShowDialog();//模式窗体在父窗体中打开子窗体HotelType ht = new HotelType(); ht.MdiParent = this; ht.Show();//非模式窗体 ht.ShowDialog();//模式窗体退出系统Application.Exit();清空文本框两种方式 this.TextBox.clear(); this.TextBox.text=””;窗体加载时查询绑定到DataGridView控件中(Load事件,查询)//定义SQL语句 string sql1 = "select * from RoomType"; //调用DBHelper类的查询方法,返回DataTable类型数据 DataTable dt = DBHelper.getDataTable(sql1); //将返回的结果绑定到DataGridView控件的数据源中 this.dataGridView1.DataSource = dt;数据中查出数据绑定到DataGridView控件中(Load事件,查询,给下拉框赋值)//定义SQL语句 string sql1 = "select * from RoomType"; //调用DBHelper类的查询方法,返回DataTable类型数据 DataTable dt = DBHelper.getDataTable(sql1); // DisplayMember为显示的文本值,ValueMember为真实的值一般为主键 this.comboBox1.DisplayMember = "typeName"; this.comboBox1.ValueMember = "typeID" //将返回的结果绑定到DataGridView控件中 this.comboBox1.DataSource = dt;根据条件查询并重新绑定到DataGridView控件中(点击查询按钮,模糊查询)一、单条件模糊查询 //获得界面上输入的查询的条件 string typeName = this.textBox1.Text; //定义包含查询条件的sql语句 string sql = string.Format("select * from RoomType where TypeName like '%{0}%'", typeName); //调用DBHelper类的查询方法,返回DataTable类型数据 DataTable dt = DBHelper.getDataTable(sql); //将返回的结果绑定到DataGridView控件中 this.dataGridView1.DataSource = dt; 二、多条件模糊查询(eg:按名称模糊查询,按日期查询)//获得界面上输入的查询的条件 string typeName = this.textBox1.Text; string dateValue= this.textBox2.Text; //定义包含查询条件的sql语句 string sql = string.Format("select * from RoomType where 1=1"); if(typeName!=””){ sql +=” and TypeName like '%”+ money1 +”%'” ; } if(dateValue!=””){ sql +=” and dateValue = '”+ dateValue +” '” ; } //调用DBHelper类的查询方法,返回DataTable类型数据 DataTable dt = DBHelper.getDataTable(sql); //将返回的结果绑定到DataGridView控件中 this.dataGridView1.DataSource = dt; 选中DataGridView中的行,将所有列的数据一个个放入到文本控件中(cellClick事件)。//在cellClick事件外定义typeID string typeID; //判断选中的行数是否>0 if (this.dataGridView1.SelectedRows.Count>0) { //”=”号左边给全局变量typeID赋值, ”=”号右边获得选中第一行第一列的值转为string类型(列标号以数据库中的顺序为准) typeID = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); //”=”号左边给文本框赋值, ”=”号右边获得选中第一行第二列的值转为string类型 this.textBox2.Text = this.dataGridView1.SelectedRows[0].Cells[1].Value.ToString(); //”=”号定义变量接收, ”=”号右边获得选中第一行第三列的值转为string类型(根据值选中复选框) string IsAddBed = this.dataGridView1.SelectedRows[0].Cells[2].Value.ToString(); //去掉变量中isAddBed数据中的空格 IsAddBed = IsAddBed.Trim(); //如果IsAddBed的内容是等于”是“,就选中复选框,否则不选中 if (IsAddBed=="是"){ this.checkBox1.Checked = true; }else{ this.checkBox1.Checked = false; } //”=”号定义变量接收, ”=”号右边获得选中第一行第四列的值转为string类型(根据值选中单选按钮) string radioButton= this.dataGridView1.SelectedRows[0].Cells[3].Value.ToString(); //如果radioButton的内容是等于”男“,就选中所对应的单选按钮 if (IsAddBed=="男"){ this.radioButton1.Checked = true; } //如果radioButton的内容等于”女“,就选中所对应的单选按钮 if (IsAddBed=="女"){ this.radioButton1.Checked = true; } }添加(click事件) 第一步、获取值//(获得文本框的值) string TypeName = this.textBox2.Text; //(判断复选框是否选中)选中了给IsAddBed赋值为”是“,否则为”否“ string IsAddBed = ""; if (this.checkBox1.Checked) { IsAddBed = "是"; }else{ IsAddBed = "否"; } //(判断单选按钮是否选中)如果男性单选按钮选中了,给sex赋值为”男“,否则为”女“ string sex = ""; if (this.radioButton1.Checked) { sex = "男"; } If(this.radioButton2.Checked){ sex = "女"; } //(获取下拉框中选中的value值) string index= this.comboBox1.SelectedValue.ToString(); //(获得下拉框中选中的文本值) string gender = this.comboBox1.text; 第二步、为空判断if (TypeName==""|| IsAddBed ==""|| sex ==""|| gender =="") { MessageBox.Show("信息填写不完整,请重新填写!"); //返回 return; } 第三步、定义sql语句string sql = string.Format("insert into RoomType values('{0}','{1}','{2}','{3}','{4}')", TypeName, TypePrice, AddBedPrice, IsAddBed, Remark); 第四步、调用dbhelper类增删改方法int result = DBHelper.Zsg(sql); 第五步、判断执行结果if (result>0) { MessageBox.Show("添加成功!"); } else { MessageBox.Show("添加失败!"); }修改(click事件)第一步、获取值//(获得文本框的值) string TypeName = this.textBox2.Text; //(判断复选框是否选中)选中了给IsAddBed赋值为”是“,否则为”否“ string IsAddBed = ""; if (this.checkBox1.Checked) { IsAddBed = "是"; }else{ IsAddBed = "否"; } //(判断单选按钮是否选中)如果男性单选按钮选中了,给sex赋值为”男“,否则为”女“ string sex = ""; if (this.radioButton1.Checked) { sex = "男"; } If(this.radioButton2.Checked){ sex = "女"; } //(获取下拉框中选中的value值) string index= this.comboBox1.SelectedValue.ToString(); //(获得下拉框中选中的文本值) string gender = this.comboBox1.text; 第二步、为空判断if (TypeName==""|| IsAddBed ==""|| sex ==""|| gender =="") { MessageBox.Show("信息填写不完整,请重新填写!"); //返回 return; } 第三步、定义sql语句(根据typeId修改)//(typeID是全局变量,从DataGridView控件的cellClick事件中获取选中的隐藏的类型ID) string sql = string.Format("update RoomType set TypeName='{0}',TypePrice='{1}',AddBedPrice='{2}',IsAddBed='{3}',Remark='{4}' where TypeID='{5}'", TypeName, TypePrice, AddBedPrice, IsAddBed, Remark, typeID); 第四步、调用dbhelper类增删改方法 int result = DBHelper.Zsg(sql); 第五步、判断执行结果 if (result>0) { MessageBox.Show("修改成功!"); //这个是刷新DataGridView列表 string sql1 = "select * from RoomType"; DataTable dt = DBHelper.getDataTable(sql1); this.dataGridView1.DataSource = dt; } else { MessageBox.Show("修改失败!"); }删除(Click事件)//定义sql语句(typeID是全局变量,从DataGridView控件的cellClick事件中获取选中的隐藏的类型ID) string sql = string.Format("delete from RoomType where TypeID='{0}'", typeID); //调用dbhelper类增删改方法 int result = DBHelper.Zsg(sql); //判断执行结果 if (result > 0) { MessageBox.Show("删除成功!"); //这个是刷新DataGridView列表 string sql1 = "select * from RoomType"; DataTable dt = DBHelper.getDataTable(sql1); this.dataGridView1.DataSource = dt; } else { MessageBox.Show("删除失败!"); } 点击关闭时再次确定是否关闭(FormClosing事件)//弹出自定义对话框 DialogResult dr = MessageBox.Show("确定要关闭吗?","提示:",MessageBoxButtons.YesNo,MessageBoxIcon.Question); //判断用户点击哪个按钮 if (dr==DialogResult.Yes) { //如果用户选择了“是”,执行关闭 Application.Exit(); } else{ //如果用户选择了“否”,取消窗体关闭事件 e.Cancel = true; } 最后再来一个DBHelper类的笔记:using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GMP { class DBHelper { //数据库链接字符串 public static string ConnString = "server=.;database=;uid=;pwd="; //数据库链接对象 public static SqlConnection Conn = null; // 初始化数据库链接 public static void InitConnection() { // 如果链接对象不存在,则打开链接 if (Conn == null) { Conn = new SqlConnection(ConnString); } // 如果链接对象关闭,则打开链接 if (Conn.State == System.Data.ConnectionState.Closed) { Conn.Open(); } // 如果链接中断,则重启链接 if (Conn.State == System.Data.ConnectionState.Broken) { Conn.Close(); Conn.Open(); } } // 查询,获取DataReader public static SqlDataReader GetDataReader(string SqlStr) { InitConnection(); SqlCommand cmd = new SqlCommand(SqlStr, Conn); // CommandBehavior.CloseConnection 命令行为,当DataReader对象被关闭时,自动关闭 // 占用的链接对象 return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); } //增、删、改操作 public static bool ExecuteNonQuery(string sqlStr) { InitConnection(); SqlCommand cmd = new SqlCommand(sqlStr, Conn); int result = cmd.ExecuteNonQuery(); Conn.Close(); return result > 0; } // 执行集合函数 public static object ExecuteScalar(string sqlStr) { InitConnection(); SqlCommand cmd = new SqlCommand(sqlStr, Conn); object result = cmd.ExecuteScalar(); Conn.Close(); return result; } } }
2020年06月05日
1,150 阅读
0 评论
0 点赞
2020-06-05
用python发送邮件
使用python发送邮件代码,做个小笔记,这玩意每次使用直接cv改一改就行了def send_mail(infomation, old_nums, old_titles, recever): new_contents = '' # By:www.lanol.cn # autor:Lan try: content = MIMEText(mail_content, 'plain', 'utf-8') reveivers = f"{recever}" content['To'] = reveivers # 设置邮件的接收者,多个接收者之间用逗号隔开 content['From'] = str("admin@lanol.cn") # 邮件的发送者,最好写成str("这里填发送者"),不然可能会出现乱码 content['Subject'] = f"{主题}" # 邮件的主题 smtp_server = smtplib.SMTP_SSL("{发送服务器}", { 端口 }) smtp_server.login("{发送邮箱}", "{邮箱密码}") smtp_server.sendmail("{发信人}", [{收信人,是一个列表}], content.as_string()) smtp_server.quit() except Exception as e: print(str(e)) except smtplib.SMTPException: print("Error: 无法发送邮件")
2020年06月05日
817 阅读
0 评论
0 点赞
2020-06-04
如何在你神不知不觉的情况下利用你QQ发送小广告,罪魁祸首竟是他,用python带你体验全过程。(三)
三、代码 在这里呢,那些比较恶意的代码就不放出来了,来几个好玩的吧,比如发说说啥的。3.1利用python发说说代码:import re import time from random import random import requests # Hash33算法 def hash33(t, e=0): for i in range(len(t)): e += (e << 5) + ord(t[i]) return 2147483647 & e # 用于登陆获取Cookie def login(): ss = requests.session() url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=' + str( '0.' + str(int(random() * 10000000000000000))) response = ss.get(url=url) with open('qrcode.png', 'wb') as f: f.write(response.content) cookie = response.cookies headers = requests.utils.dict_from_cookiejar(cookie) print(headers) while True: url = f'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html' f'%3Fpara%3Dizone%26from%3Diqq&ptqr' f'token={hash33(headers["qrsig"])}&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0' f'-1542784335061&js_ver=10289&js_type=1&login_sig=hn6ZiMZRPT8LWFsFG3MrScznzLVrdbwS9EIo-ihAmeD' f'*YmOfqP3uoI6JytVVQYw2&pt_uistyle=40&aid=549000912&daid=5& ' html = ss.get(url=url, headers=headers) type = re.findall('[u4e00-u9fa5]+', html.text)[0] if type == '二维码未失效': print(type) elif type == '二维码认证中': print(type) elif type == '登录成功': print(type) return html.cookies else: print("二维码已失效,请重新扫码!") login() time.sleep(2) # 主体,用来发送说说的 def send(): headers = { 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8', 'origin': 'https://user.qzone.qq.com', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/83.0.4103.61 Safari/537.36', } cookie = login() cooksdict = requests.utils.dict_from_cookiejar(cookie) content = input("请输入说说内容:") qq = input("请输入你的QQ:") res = requests.get(url=f'https://user.qzone.qq.com/{qq}/infocenter', headers=headers, cookies=cookie).text # 获取qzonetoken的页面源码 qzonetoken = re.findall('{ try{return "(.*?)";}', res)[0] # 解析出qzonetoken g_tk = hash33(cooksdict['skey'], 5381) # 从Cookie中获取g_tk url = f'https://user.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_publish_v6?qzonetoken={qzonetoken}&g_tk={g_tk}' data = { 'syn_tweet_verson': '1', 'paramstr': '1', 'pic_template': '', 'richtype': '', 'richval': '', 'special_url': '', 'subrichtype': '', 'who': '1', 'con': content, 'feedversion': '1', 'ver': '1', 'ugc_right': '1', 'to_sign': '0', 'hostuin': qq, 'code_version': '1', 'format': 'fs', 'qzreferrer': 'https://user.qzone.qq.com/' + qq, } response = requests.post(url=url, headers=headers, data=data, cookies=cookie) print(response.status_code) if __name__ == '__main__': send()成功截图: 4.2 盘他继续抓包分析,账号密码随便输入之后,然后他提示密码错误,好吧那就来复杂一点的虚假信息。可以看到他这时候跳转到了官方页面,掩人耳目,让你不知道自己的信息已经泄露了。然后分析一下这个记录这是一个get请求,账号密码都携带在请求url中,这样的话,我们只需要不断生成随机信息,请求过去,这样他就会不断接受到你发的虚假信息了。 能看到这里说明,你厉害,欢迎来我的博客转转百度搜索:Lan的小站,第一个就是哦,或者直接访问https://www.lanol.cn
2020年06月04日
844 阅读
0 评论
0 点赞
2020-06-03
如何在你神不知鬼不觉的情况下利用你QQ发送小广告,罪魁祸首竟是他,用python带你体验全过程。(二)
2.3 伪装成用户发送说说2.3.1 使用python发说说 伪装发包呢,我们就直接用python盘他,那就这样开始吧。 首先呢,我们需要导入一个模块requests,用来帮助我们发包以及后期的骚操作。import requests 然后就是设置三个参数,请求URL,请求头,表单数据,这些在上一节中以及分析过了,直接照搬照抄就行了,然后就是代码,url = 'https://user.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_publish_v6?qzonetoken=79509429e2fcb1a2a144a81d05f276e0695b6c542b02be691eb7e50c3944ed46751c4d46c22bb589b4&g_tk=428053921' headers = { 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8', 'cookie': 'qz_screen=1536x864; QZ_FE_WEBP_SUPPORT=1; __Q_w_s__QZN_TodoMsgCnt=1; Loading=Yes; RK=wEqZRhmiYM; ptcz=6ba4ad48c0993a9803b17b7cd71f402d78cc3a13ac6c8eaad6a2f3425ac813b0; logout_page=dm_loginpage; dm_login_weixin_rem=; pgv_pvi=2620835840; pgv_pvid=6287814200; pgv_info=ssid=s4061550260; pgv_si=s32916480; _qpsvr_localtk=0.044227743304393385; ptui_loginuin=2123432340; uin=o2123432340; skey=@ZIn5D4kG1; p_uin=o2123432340; pt4_token=W05iPjuHpiITZnV9DPyR0kdOEkKObZr4bJxhq7vd3Kc_; p_skey=GSHvtQxQPQcYWoUBhol-r8ZI2jlrN0uHE*W7Yl6ejkY_; 2123432340_todaycount=0; 2123432340_totalcount=7; cpu_performance_v8=4', 'origin': 'https://user.qzone.qq.com', 'referer': 'https://user.qzone.qq.com/2123432340', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36', } data = { 'syn_tweet_verson': '1', 'paramstr': '1', 'pic_template': '', 'richtype': '', 'richval': '', 'special_url': '', 'subrichtype': '', 'who': '1', 'con': '2020年6月2日18:24:57,伪造发说说测试!!!', 'feedversion': '1', 'ver': '1', 'ugc_right': '1', 'to_sign': '0', 'hostuin': '2123432340', 'code_version': '1', 'format': 'fs', 'qzreferrer': 'https://user.qzone.qq.com/2123432340', } 然后就是POST请求,这样写:response = requests.post(url=url, headers=headers, data=data) 然后为了展示效果,我们输出一下状态码以及返回内容。print(response.text) print(response.status_code)然后就是代码跑起来!跑完之后可以看到,这里返回的状态码是200,说明请求正常。 返回到自己的空间,刷新一下,可以空间说说已经发送出去了,这样就实现了用python发说说的过程。2.3.2 获取qzonetoken 接下来的任务就是,分析qzonetoken和g_tk这两个值是怎么来的?首先第一个qzonetoken,现在回到浏览器,全局搜索一下qzonetoken, 可以发现这里出现很多条包含qzonetoken的,这里我们再在qzonetoken后面加一个 =再进行搜索,因为我们要知道他是怎么来的,所以查他是怎么赋值的。 哦吼,这样就只有一条信息了,然后点开看一下。然后这就是所谓的qzonetoken了,居然直接包含在网页代码中,所以到此就可以取得qzonetoken了,直接到时候解析html即可。2.3.3 获取g_tk 然后就是下一个值g_tk,然后在这搜索g_tk =,可以看到只有一条记录了, 然后我看到了一个getToken(),我们来搜索一下这个方法 然后就可以看到这个方法是这样子的(红框内为算法,箭头表示位置) 到这里也就只能打个断点调试一下吧, 然后就卡在这里了,我们来慢慢分析一下。往上面翻一点就可以看到这串东西了。def g_tk(t): e = 5381 for i in range(len(t)): e += (e << 5) + ord(t[i]) return e & 2147483647看到这,我不禁想起了我中午才弄过的hash33,详情见:python实现hash33加密算法,长得似乎差不多呀。然后问题就来了,n是个啥,既然在调试,我们直接控制台输出一下就行了getToken: function() { try { return top.QZONE.FP.getACSRFToken() //尝试返回 } catch (a) { var e = 5381 //否则直接算 , t = n.get("p_skey") || n.get("skey") || n.get("rv2"); for (var i = 0, r = t.length; i < r; ++i) { e += (e << 5) + t.charAt(i).charCodeAt() } return e & 2147483647 } }, 输出测试一下: 看,又出现了,他的neme是不是就是罪魁祸首cookie,这样的话t也就不难理解了,t = n.get("p_skey") || n.get("skey") || n.get("rv2") 就是取cookie里面的p_skey或者skey或者rv2,然后最后返回了一串数字,就是所谓的g_tk了,不信?我们来看下。 然后呢,用python改写一下就是这样子的。def g_tk(t): e = 5381 for i in range(len(t)): e += (e << 5) + ord(t[i]) return e & 2147483647输出测试一下:传入p_skey或者skey或者rv2就可以返回需要的g_tk了。至此为止,我们就只需要获取到Cookie就可以为所欲为了,那么这时候可能就有人问了,Cookie怎么来呢,别人怎么知道我的Cookie呢?那就接着往下看吧!2.4 怎么获取你的Cookie 这个就有很多方式了,不过只要你注意的话还是可以防得住的,像我的cookie就从来没有泄露过。 这不正愁不知道哪里找素材,这里就有人送上门来了,刚刚空间收到一条留言,是这样子的眼熟不。 我们将这个二维码转成网址,最终的结果是这样https://w.url.cn/s/ApUGGIq,然后这个是一个短网址,我们需要将他还原一下, 哎哟我去,又是一层短网址,这套娃玩的。。继续走你然后就找到了这个网站https://qdhlcgs.com/高仿QQ空间登陆页面。看人家多贴心,键盘都给你准备好了 如果这时候你输入了账号密码,你的QQ和密码就会被记录到后台,这时候Cookie啥的就不在话下了,然后那些所谓的黑客最后只需要将账号密码导出,批量通过QQ账号密码获取Cookie,然后就可以为所欲为了,然后我在网上看到这么一款软件,你懂得。基本上发说说,给好友群发消息或者等等一系列行为基本上都可以实现了。 至于怎么登陆获得cookie可以看下我的这篇用python代码扫码登陆QQ空间获取Cookie值,QQ登陆协议,python模拟登陆QQ
2020年06月03日
823 阅读
0 评论
0 点赞
2020-06-03
如何在你神不知鬼不觉的情况下利用你QQ发送小广告,罪魁祸首竟是他,用python带你体验全过程。(一)
一、前言 在日常生活中是不是经常看到朋友QQ被盗然后发一些羞羞的东西亦或者一些莫名其妙的网址呢?你真的以为是好友QQ被盗了吗?其实不是的,经过我的一顿操作分析,得出结论罪魁祸首居然是Cookie,然后让我们用python来实现这个过程。二、分析2.1 为什么是Cookie呢? 曾在几年前,我混迹过所谓的盗号圈,深谙此道,其之繁琐不可谓让人望而止步,首先就是需要号主大量的真实信息,比如姓名,身份证,密码,老密等。然后还得是号主长期不在线等情况,才有可能盗号成功。而那些所谓的“黑客”不可能花费这么大的精力去针对你一个号,因为你应该可以经常看到自己的好友发些这样的内容吧。这是一个广撒网的过程,海王,你懂得。 如果是被盗号,那么密码势必会被更改,如果密码被更改,你手机上所有用QQ登陆的软件都会被强制下线,那这个时候你会无所察觉吗?2.2 怎么发送说说呢?2.2.1 这是一堆废话 首先,我们平时发一条说说需要什么呢?一台有网的手机,再打开QQ空间,然后发送说说,亦或者登陆电脑QQ空间页面,然后发送一条说说,这样子一条说说就发出去了,咳咳,别走哟,干货马上开始!2.2.2 抓包分析 硬核开始,现在开始分析究竟发一条说说需要什么(为了隐私,我换成小号来试验了) 浏览器F12,切换到Network。选择XHR。 点击发送,我们就会看到右边这个出现了一个内容 为了方便我们分析,所以先将右边这个窗口分离出来,操作步骤: 然后来介绍一下,这个包吧,仔细看图哟,首先是第一部分General 然后是Response Headers这一块是返回头,我们一般可以不用管,重点是下面的这个Request Headers请求头,因为我们需要发送说说就需要伪造成号主,而这一块就是所谓的号主信息,也就是Cookie。 用户电脑信息,如浏览器,系统 Query String Parameters信息,请求url里面的参数 最后也是最有看点的信息Form Data,不知道大家是否还记得以前学过的HTML的Form,就是那个哟,表单数据。 综上,我们对发送一条说说需要哪些信息进行了分析,就目前来看,形势一片大好,为啥呢?在Query String Parameters和Form Data两个东西中,我们只有两个参数需要去“破解”,一个是qzonetoken和g_tk,其他的都是些0,1啥的,暂时不管,有需要我们再去破解(就是这么直接),然后con就是我们要发生的内容,So?进入下一步,用软件伪造发包。
2020年06月03日
837 阅读
0 评论
0 点赞
2020-06-02
用python代码扫码登陆QQ空间获取Cookie值,QQ登陆协议,python模拟登陆QQ
前几天研究了下QQ群的几个接口,但是最后面都需要手动输入Cookie才可以运行,然后今天又研究了一下QQ空间的登陆接口,然后就有了下面这些代码,最终的返回值是登录成功的Cookie值。需要手动打开目录下的qrcode.png然后进行扫码。 import re import time from random import random import requests def hash33(t): e = 0 for i in range(len(t)): e += (e << 5) + ord(t[i]) return 2147483647 & e def login(): ss = requests.session() url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=3&d=72&v=4&t=' + str( '0.' + str(int(random() * 10000000000000000))) response = ss.get(url=url) with open('qrcode.png', 'wb') as f: f.write(response.content) cookie = response.cookies headers = requests.utils.dict_from_cookiejar(cookie) print(headers) while True: url = f'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html' f'%3Fpara%3Dizone%26from%3Diqq&ptqr' f'token={hash33(headers["qrsig"])}&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0' f'-1542784335061&js_ver=10289&js_type=1&login_sig=hn6ZiMZRPT8LWFsFG3MrScznzLVrdbwS9EIo-ihAmeD' f'*YmOfqP3uoI6JytVVQYw2&pt_uistyle=40&aid=549000912&daid=5& ' html = ss.get(url=url, headers=headers) type = re.findall('[u4e00-u9fa5]+', html.text)[0] if type == '二维码未失效': print(type) elif type == '二维码认证中': print(type) elif type == '登录成功': print(type) return html.cookies else: print("二维码已失效,请重新扫码!") login() time.sleep(2) if __name__ == '__main__': print(login())
2020年06月02日
2,977 阅读
7 评论
0 点赞
2020-06-02
Python实现Hash33加密算法
今天在研究QQ登陆的时候又发现一个值是和上次bkn加密方式有点像的,然后这次似乎看到了名字Hash33然后这里就做一个笔记吧,说不定下次还有用。def hash33(t): e = 0 for i in range(len(t)): e += (e << 5) + ord(t[i]) return 2147483647 & e
2020年06月02日
1,990 阅读
0 评论
0 点赞
1
...
42
43
44
...
65