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

模拟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. JavaScript思维导图—数据类型

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  2. Unity3D核心类型一览

    Unity3D核心类型一览 本文记录了Unity3D的最基本的核心类型.包括Object.GameObject.Component.Transform.Behaviour.Renderer.Colli ...

  3. Spring-Context之四:Spring容器及bean的定义

    Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...

  4. [Linux基础]Linux基础知识入门及常见命令.

    前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1:192.168.40.11Linux ip:192.168 ...

  5. 《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

    以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...

  6. mysql 的简单优化

    合理的建立索引的建议: (1)  越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间,处理起来更快. (2)  简单的数据类型更好:整型数据比起字符,处理开销更小,因 ...

  7. fir.im Weekly - 从零开始,搭建理想的直播平台

    2016年苹果发布会如期而至,新一代的 iPhone 7, Apple Watch 同时亮相,可惜大家期待的 MacBookPro.AR.VR产品并未出现.不论大家对新产品是"买买买&quo ...

  8. SpringMVC与mybatis整合

    一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generator ...

  9. Java 集合 — HashMap

    HashMap 无序(每次resize的时候都会变) 非线程安全 key和value都看可以为null 使用数组和链表实现 查找元素的时候速度快 几个重要属性: loadFactor:用来计算thre ...

  10. Enerprise Solution Main 启动方法源代码

    .NET 系统以Main方法作为应用程序的启动入口点,Enterprise Solution的启动程序源代码如下: [STAThread] static void Main() { string MA ...