发表说说之前,必须登录。

模拟QQ登录 >> http://www.cnblogs.com/deeround/p/4386629.html

发表带图说说,自然少不了上传图片,我这使用的PC端上传图片

首先,FileHelper的创建

QQ空间上传图片,使用的flash上传图片,所以我们需要在post的时候,提交的数据进行一个转换。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web; namespace Web.QQ
{
class FileHelper
{
private List<byte> formData;
private Encoding encode = Encoding.GetEncoding("UTF-8");
public FileHelper()
{
formData = new List<byte>();
}
public void Add(string name, string value)
{
formData.AddRange(encode.GetBytes("--dnpbajwbhbccmrkegkhtrdxgnppkncfv\r\n"));
formData.AddRange(encode.GetBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n"));
formData.AddRange(encode.GetBytes("\r\n"));
formData.AddRange(encode.GetBytes(value + "\r\n"));
}
public void Add(string name, string fileName, byte[] fileData)
{
formData.AddRange(encode.GetBytes("--dnpbajwbhbccmrkegkhtrdxgnppkncfv\r\n"));
formData.AddRange(encode.GetBytes("Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"\r\n"));
formData.AddRange(encode.GetBytes("Content-Type: application/octet-stream\r\n"));
formData.AddRange(encode.GetBytes("\r\n"));
formData.AddRange(fileData);
formData.AddRange(encode.GetBytes("\r\n"));
}
public void Add()
{
formData.AddRange(encode.GetBytes("--dnpbajwbhbccmrkegkhtrdxgnppkncfv--"));
}
public List<byte> GetFormData()
{
Add();
return formData;
}
}
}

接着,一个生产图片提交的数据方法

         public string UploadImage(string qq, string filePath, Model model)
{
string skey = GetCookieString(model.CookieContainer, "skey"); FileStream file = new FileStream(filePath, FileMode.Open);
byte[] bb = new byte[file.Length];
file.Read(bb, , (int)file.Length);
file.Close(); FileHelper form = new FileHelper();
form.Add("hd_quality", "");
form.Add("hd_height", "");
form.Add("filename", "filename");
form.Add("upload_hd", "");
form.Add("hd_width", "");
form.Add("charset", "utf-8");
form.Add("output_type", "xml");
form.Add("uin", qq);
form.Add("output_charset", "utf-8");
form.Add("albumtype", "");
form.Add("exif_info", "extendXml:");
form.Add("skey", skey);
form.Add("zzpaneluin", qq);
form.Add("refer", "shuoshuo");
form.Add("uploadtype", "");
form.Add("photoData", "filename");
form.Add("Filename", Path.GetFileName(filePath));
form.Add("filename", Path.GetFileName(filePath), bb);
form.Add("Upload", "Submit Query");
form.GetFormData(); string url = "http://shup.photo.qq.com/cgi-bin/upload/cgi_upload_image";
string html = new Helper().Post(url, form.GetFormData().ToArray(), model.CookieContainer); return html;
}

接着,发表说说的方法

 #region 空间动作
public void PublishShuoShuo(string qq,Model model)
{
string gtk = new Helper().GetGtk(GetCookieString(model.CookieContainer, "skey"));
string url = "http://taotao.qq.com/cgi-bin/emotion_cgi_publish_v6?g_tk=" + gtk;
string content = "我是机器人,请不要为我点赞~~";
string postData = "qzreferrer=http%3A%2F%2Fuser.qzone.qq.com%2F" + qq + "&syn_tweet_verson=1&paramstr=1&pic_template=&richtype=&richval=&special_url=&subrichtype=&con=" + HttpUtility.UrlEncode(content) + "&feedversion=1&ver=1&ugc_right=1&to_tweet=0&to_sign=0&hostuin=" + qq + "&code_version=1&format=fs"; string html = new Helper().Post(url, postData, model.CookieContainer);
}
public void PublishShuoShuo(string qq, string filePath, Model model)
{
//先上传图片
string html = UploadImage(qq, filePath, model); IDictionary<string, string> data = new Dictionary<string, string>();
string[] lines = html.Replace("\n", "|").Split('|');
foreach (var line in lines)
{
Regex regex = new Regex("<(.+)>(.*)</.+>");
MatchCollection mc = regex.Matches(line);
foreach (Match m in mc)
{
if (m.Groups.Count > )
{
data.Add(m.Groups[].Value, m.Groups[].Value);
}
}
} string gtk = new Helper().GetGtk(GetCookieString(model.CookieContainer, "skey"));
string url = "http://taotao.qq.com/cgi-bin/emotion_cgi_publish_v6?g_tk=" + gtk;
string richval = string.Format(",{0},{1},{2},{3},{4},{5},,{4},{5}", data["albumid"], data["lloc"], data["sloc"], data["type"], data["height"], data["width"]);
string picbo = string.Format("{0} {1}", data["pre"].Substring(data["pre"].IndexOf("bo=") + ), data["url"].Substring(data["url"].IndexOf("bo=") + ));
string content = "我是机器人,请不要为我点赞~~";
string postData = "qzreferrer=http%3A%2F%2Fuser.qzone.qq.com%2F" + qq + "&syn_tweet_verson=1&paramstr=1&pic_template=&richtype=1&richval=" + HttpUtility.UrlEncode(richval) + "&special_url=&subrichtype=1&pic_bo=" + HttpUtility.UrlEncode(picbo) + "&con=" + content + "&feedversion=1&ver=1&ugc_right=1&to_tweet=0&to_sign=0&hostuin=" + qq + "&code_version=1&format=fs"; string html1 = new Helper().Post(url, postData, model.CookieContainer);
} #endregion

最后,如何调用

new Methods().PublishShuoShuo(qq, "D:\\1.png", model);

到此结束,目前只能发送一张图,发表多图说说的话,应该是多执行几次UploadImage,同时生产post数据也需要相应的修改,不过这个还没做。

QQ--模拟发表带图说说的更多相关文章

  1. QQ模拟自动登录实现

    QQ模拟自动登录实现 本篇文章主要介绍"QQ模拟自动登录实现(带验证码)",主要涉及到java 实现QQ自动登录(带验证码)方面的内容,对于java 实现QQ自动登录(带验证码)感 ...

  2. vbs脚本实现qq定时发消息(初级)

    vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利 ...

  3. noip模拟27[妹子图·腿·腰](fengwu半仙的妹子们)

    \(noip模拟27\;solutions\) 这次吧,我本来以为我能切掉两个题,结果呢??只切掉了一个 不过,隔壁Varuxn也以为能切两个,可惜了,他一个都没切...... 确实他分比我高一点,但 ...

  4. 借用smtp.qq.com发邮件

    至于sentmail和postfix的配置有多么麻烦学生在这里就不多废话了...反正是配置了N个小时,最终弄的头晕眼花也没弄好... 下面的方法可以让你完全摆脱这两个工具...当然,你要是想做邮件服务 ...

  5. wrf模拟的domain图绘制

    wrf模拟的区域绘制,domain图,利用python的cartopy库绘制模拟区域 参考Liang Chen的draw_wrf_domian.py这个代码, 出处python画wrf模式的模拟区域 ...

  6. java mail使用qq邮箱发邮件的配置方法

    最近自己折腾了下Java中利用mai发送QQ邮件 1.QQ邮箱设置 1.1 进去QQ邮箱-->设置-->账号-->进行设置如下图 2.foxmail设置(由于我要利用它收邮件) 2. ...

  7. QQ互发消息

    private NewsData data; private void button3_Click(object sender, EventArgs e) //发送 { string x = text ...

  8. 解决laravel使用QQ邮箱发邮件失败

    在 laravel 中使用 QQ 发送邮件的时候莫名其妙的出现了如下错误:Connection could not be established with host smtp.exmail.qq.co ...

  9. 带权单源最短路发[稠密图](Dijkstra)

    对于稠密图,采用邻接矩阵较为合适 所以我们先构建一个邻接矩阵 typedef int Vertex; typedef int WeightType; //图 typedef struct MyGrap ...

随机推荐

  1. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  2. MVVM架构~Knockoutjs系列之text,value,attr,visible,with的数据绑定

    返回目录 Knockoutjs是微软mvc4里一个新东西,用这在MVC环境里实现MVVM,小微这次没有大张旗鼓,而是愉愉的为我们开发者嵌入了一个实现MVVM的插件,这下面的几篇文章中,我和大家将一起去 ...

  3. [Spring框架]Spring JDBCTmplate基础入门总结.

    前言:前面有讲过 Spring IOC以及AOP的基本使用方法, 这里就再来讲下Spring JDBCTemplate的使用方法. 一, 概述这里先说一下Spring 整合的一些模板: 从上图中可以看 ...

  4. Atitit 面向对象  封装的实现原理

    Atitit 面向对象  封装的实现原理 1.1. 动态对象的模拟使用map+函数接口可以实现1 1.2. 在用结构体 + 函数指针 模拟 对象 1 1.3. This指针..1 1.4. " ...

  5. 大数据时代的IT架构设计

    大数据时代的IT架构设计(来自互联网.银行等领域的一线架构师先进经验分享) IT架构设计研究组 编著   ISBN 978-7-121-22605-2 2014年4月出版 定价:49.00元 208页 ...

  6. js 编码、解码与asp.net 编码、解码

    js对URL提供:escape,encodeURI,encodeURIComponent 的编码方法encodeURIComponent:推荐使用,它是将中文.韩文等特殊字符转换成utf-8格式的ur ...

  7. WPF入门教程系列八——布局之Grid与UniformGrid(三)

    五. Grid Grid顾名思义就是“网格”,它的子控件被放在一个一个实现定义好的小格子里面,整齐配列. Grid和其他各个Panel比较起来,功能最多也最为复杂.要使用Grid,首先要向RowDef ...

  8. javascript_core_07之错误处理、函数作用域

    1.错误处理:保证程序发生错误时,不会被强制退出: ①处理方式:try{可能出错的正常语句:}catch(err){只有出现错误时才执行的错误处理代码:}finally{无论是否出错都必须执行的代码: ...

  9. APP性能测试

    方法一: 本地安装安卓模拟器,用LR选择模拟器录制方式录制 方法二: 手机真机需要root,可以在电脑上下载一键root工具(如卓大师),然后手机和电脑用数据线连接,然后root. 在手机上运行 Mo ...

  10. 第六节:Vue过滤器的用法和自定义过滤器

    1.过滤器的用法,用  '|' 分割表达式和过滤器. 例如:{{ msg |  filter}}     {{msg | filter(a)}}  a就标识filter的一个参数. 用两个过滤器:{{ ...