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

模拟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. MVC5:使用Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...

  2. Linux网路编程系列-网络I/O模型

    应用程序从网络中拿数据,要经历两个阶段:1.等待数据准备好-分组到达,被拷贝到内核缓冲区,组装数据报:2.数据从内核缓冲区拷贝至用户态应用程序的缓冲区.Unix下五个I/O模型: 阻塞I/O: 进程调 ...

  3. make file教程(转)

    最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...

  4. ios 滚动视图响应touchesBegin,touchesEnd等方法

    能够滚动的控件都不会响应touchesBegin,touchesEnd等方法,这就需要对这个类进行封装 以UITextView为例 1,创建CustomTextView类,继承与UITextView ...

  5. 第三天 vi编辑器使用和软件安装

    [复习] 判断题: 查看某文件权限为rwxr-xr-- ,则其所属组权限为只读. 对一个目录有w权限,表示可以修改目录下文件内容. 3..tar.gz格式的压缩包可以使用tar -xjf解压缩 4.m ...

  6. 常用 sql

    一. sql 多个字段拼接 mysql:     1. concat函数  如果连接串中存在NULL,则返回结果为NULL:        例如: select concat('1','2','3') ...

  7. javascript_core_01之数据类型与运算

    1.数据类型转换: ①隐式转换:程序根据需要,自动转化数据类型: ②强制转换:主动调用函数执行转换: 2.字符串强制转换: ①x.toString():不能转换null和undefined: ②Str ...

  8. -bash: /usr/local/bin/react-native: No such file or directory

    执行react-native run-android/run-ios的时候出现 -bash: /usr/local/bin/react-native: No such file or director ...

  9. Shader预处理宏、内置状态变量、多版本编译等

    预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D SHADER ...

  10. 仿SGI STL的traits技法

    首先是iterator traits,这个是用来萃取迭代器的特性的 #ifndef _STL_ITERATOR_H_ #define _STL_ITERATOR_H_ #include <cst ...