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

模拟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. java那些小事---用偶数做判断,不要用基数做判断

          今天做项目遇到这样一个奇葩问题:我们先看如下代码: int ftcs = dealFtcs(ftcs); if(ftcs % 2 == 1){ //奇数 /* * 处理..... */ } ...

  2. 使用protractor操作页面元素

    Protractor是为Angular JS应用量身打造的端到端测试框架.它可以真实的驱动浏览器,自动完成对web应用的测试.Protractor驱动浏览器使用的是WebDriver标准,所以使用起来 ...

  3. MVVM架构~knockoutjs系列之数组的$index和$data

    返回目录 已经写了很多knockoutjs的文章了,今天在review代码时,忽然看到一个问题,在knockout环境下,如何遍历一个简单的数组?对于遍历对象组件的数组来说,很容易,直接foreach ...

  4. Dubbo的使用及原理浅析.

    前面几个博文中关于SSM 框架已经搭建完成, 这里来讲下项目中使用到的Dubbo以及自己了解到的关于Dubbo的一些知识. Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天 ...

  5. salesforce 零基础学习(二十五)PickList简单联动操作

    有的时候,项目需要一些联动的操作,比如省和市之间的联动,不同的省应该显示不同的城市. 操作步骤如下: 1.新建provice字段,并且初始化相关的值 2.新建city字段,并且初始化相关的值 3.在P ...

  6. Struts2学习笔记 - HelloWorld总结

    相信网上已经有很多关于struts2的HelloWorld可参考,我这里就不重复了,没个学struts2的人都会做过很多个HelloWorld,而我这里就总结一下一个简单的HelloWorld 我在一 ...

  7. Java 线程 — AbstractQueuedSynchronizer

    锁 锁就是一种状态,比如互斥锁:同一时间只能有一个线程拥有,可以使用一个整型值来标志当前的状态 0:表示没有现成占有锁 1:表示锁已经被占用 AbstractQueuedSynchronizer 实现 ...

  8. TSql Output 用法

    第一部分:TSql Output 关键字有两种应用场景 1,作为存储过程的参数类型,从存储过程中返回数据 2,返回受 INSERT.UPDATE.DELETE 或 MERGE 语句影响的各行中的信息, ...

  9. 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

        最近在给一个客户做调优的时候发现一个很有意思的现象,对于一个复杂查询(涉及12个表)建立必要的索引后,语句使用的IO急剧下降,但执行时间不降反升,由原来的8秒升到20秒.     通过观察执行 ...

  10. select元素javascript常用操作 转

    /*------------------------------------------------------ *作者:xieyu @ 2007-08-14 *语言:JavaScript *说明:s ...