放一个WPF源代码,源代码地址

http://download.csdn.net/detail/witch_soya/6195987

代码没多少技术含量,就是用WPF做的一个QQ空间相册下载工具,效果见上一篇文章。

http://blog.csdn.net/witch_soya/article/details/8494712

注意~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

因为这个获取相册的方式是通过网上找到的QQ空间接口来的,所以不保证一直有效。最稳妥的方式是对浏览器访问QQ相册进行抓包分析,这个就不做详细分析了。

说一下软件的流程 。

QQIdea这个工程是下载图片的也就是左边这个类似于QQ登陆框的这个,3DGalaxy这个工程是用3D效果显示图片的。也就是右边这个相册预览的程序,两个exe程序之间通过进程通讯的方式实现互动。整个软件没有进行比较详细的规划,所以代码风格有些乱,还有些逻辑上面存在一些bug,现在没有时间修改,放出代码给有需要的同学一个参考。

QQIdea这个工程的原理是这样

1.从编辑框获取要下载相册的QQ号码。

2.获取相册Route

http://route.store.qq.com/GetRoute?UIN=QQ号

得到返回的内容类似这样

XML Source Code
<?xml version="1.0" encoding="gb2312"?>
<data>
<uin>634963471</uin>
<r>photo.qq.com</r>
<u>hzup.photo.qq.com</u>
<nu>hz.photo.qq.com</nu>
<p>hznewp.photo.qq.com</p>
<s>hzstatic.photo.qq.com</s>
<read>1</read>
<write>1</write>
<idcno>2</idcno>
</data>

返回可以查看的相册的信息(包括ID等)
这里的hzalist是根据上面的route而替换的
http://hzalist.photo.qq.com/fcgi-bin/fcg_list_album?uin=634963471
得到的信息如下

<?xml version="1.0" encoding="gbk"?>
<data>
<album>
<anonymity>0</anonymity>
<bitmap>11000000</bitmap>
<classid>0</classid>
<comment>1</comment>
<createtime>1326087421</createtime>
<desc/>
<handset>2</handset>
<id>V11db8OS2zV1ME</id>
<lastuploadtime>1357654102</lastuploadtime>
<modifytime>1357654102</modifytime>
<name>贴图相册</name>
<order>0</order>
<pre>http://a223.photo.store.qq.com/psb?/V11db8OS2zV1ME/y7FgmoTf4iFSPSRtVI2XpzMfo8SbXdMFrsWFKZ7mfeM!/a/YcxY94RNAAAAYta274RQAAAA</pre>
<priv>1</priv>
<pypriv>4</pypriv>
<total>52</total>
<viewtype>0</viewtype>
</album>
<left>
<album>

注意这里得到了相册的名称是 贴图相册  相册的<pre>标签的内容就是预览图地址了。
得到相册的id=V11db8OS2zV1ME

接着访问
http://hzplist.photo.qq.com/fcgi-bin/fcg_list_photo?uin=634963471&albumid=V11db8OS2zV1ME&outstyle=1&t=0.1740948824551711

得到相册的所有图片的地址,名称等等信息开始下载。

下载完毕后通过进程通信的方式通知3DGALXAY工程加载图片

进程通信的方式如下。首先定义一个信使类

public class MessageHelper
{
public const int WM_COPYDATA = 0x004A; [DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage
(
IntPtr hWnd, //目标窗体句柄
int Msg, //WM_COPYDATA
int wParam, //自定义数值
ref CopyDataStruct lParam //结构体
); [DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); /// <summary>
/// SendMessage To Window
/// </summary>
/// <param name="windowName">window的title,建议加上GUID,不会重复</param>
/// <param name="strMsg">要发送的字符串</param>
public static void SendMessage(string windowName, string strMsg)
{ if (strMsg == null) return; IntPtr hwnd = FindWindow(null, windowName); if (hwnd != IntPtr.Zero)
{
CopyDataStruct cds; cds.dwData = IntPtr.Zero;
cds.lpData = strMsg; //注意:长度为字节数
cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;
// 消息来源窗体
int fromWindowHandler = 0;
SendMessage(hwnd, WM_COPYDATA, fromWindowHandler, ref cds); } } /// <summary>
/// SendMessage To Window
/// </summary>
/// <param name="windowName">window的title,建议加上GUID,不会重复</param>
/// <param name="strMsg">要发送的字符串</param>
public static void SendMessageByProcess(string processName, string strMsg)
{ if (strMsg == null) return; var process = Process.GetProcessesByName(processName);
if (process.FirstOrDefault() == null) return;
var hwnd = process.FirstOrDefault().MainWindowHandle;
if (hwnd == IntPtr.Zero) return; if (hwnd != IntPtr.Zero)
{
CopyDataStruct cds; cds.dwData = IntPtr.Zero;
cds.lpData = strMsg; //注意:长度为字节数
cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;
// 消息来源窗体
int fromWindowHandler = 0;
SendMessage(hwnd, WM_COPYDATA, fromWindowHandler, ref cds); } } [StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;//字符串长度 [MarshalAs(UnmanagedType.LPStr)]
public string lpData;//字符串
}
}

在下载完毕后通过调用信使类的发送函数来通知3DGalaxy.exe展示制定地址的图片

//下载完毕就通过进程通信方式通知Galaxy.exe加载
MessageHelper.SendMessage("QZone-Album Ver1.0 By Witch_Soya2013",strLocalPath);

在3DGalaxy.exe中接收进程之间的消息方式

首先在构造函数中添加进程通信功能

 //添加进程通信功能
Loaded += new RoutedEventHandler(MainWindow_Loaded);
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
// throw new NotImplementedException();
(PresentationSource.FromVisual(this) as HwndSource).AddHook(new HwndSourceHook(this.WndProc));
}

接着就开始处理进程之间的消息

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
//throw new NotImplementedException();
//收到进程通信之间的消息
if (msg == MessageHelper.WM_COPYDATA)
{
CopyDataStruct cds = (CopyDataStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
//MessageBox.Show(cds.lpData);
string strUrl = cds.lpData;
//这里就获取到了需要展示的本地图片地址,添加到展示框中去
imageSwitchView1.AddImage(strUrl);
}
return hwnd;
} public class MessageHelper
{
public const int WM_COPYDATA = 0x004A;
}
[StructLayout(LayoutKind.Sequential)]
public struct CopyDataStruct
{
public IntPtr dwData;
public int cbData;//字符串长度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;//字符串
}

整个的流程就是这样。至于WPF3D效果,界面的白云树叶飘动效果,就是一些基础的StoryBoard特效,可以去看深入浅出WPF。

/********************************Witch_Soya*********************/

/*******************************2013年9月2日11:02:11*********************/

[WPF源代码]QQ空间相册下载工具的更多相关文章

  1. qq空间相册下载

    qq空间相册下载 描述 目前功能只可以下载 单个相册 程序基本是3个独立分开的部分. 解析(某一用户)所有相册 解析(单个)相册所有图片地址并写文件 根据文件下载图片 目的 只要有权限可以访问到的相册 ...

  2. Python_小林的爬取QQ空间相册图片链接程序

    前言 昨天看见某人的空间有上传了XXXX个头像,然后我就想着下载回来[所以本质上这是一个头像下载程序],但是一个个另存为太浪费时间了,上网搜索有没有现成的工具,居然要注册码,还卖45一套.你们的良心也 ...

  3. 如何破解QQ空间相册密码访问权限2019方法

    今天小编给大家介绍一下最新的QQ空间相册破解方法,是2019年最新方法,本方法来自互联网,下面开始方法教程 教程之前我们需要下载软件,地址我发在下方 软件切图 1.首先我们打开软件,然后在“操作界面” ...

  4. QQ空间相册展示特效

    <!doctype html> <html lang="en"> <head> <title>QQ空间相册展示特效<title ...

  5. python+selenium+requests爬取qq空间相册时遇到的问题及解决思路

    最近研究了下用python爬取qq空间相册的问题,遇到的问题及解决思路如下: 1.qq空间相册的访问需要qq登录并且需是好友,requests模块模拟qq登录略显麻烦,所以采用selenium的dri ...

  6. QQ空间相册照片批量导出

    QQ空间相册照片批量导出 先自己创建一个私人的单独的群,然后创建相册,上传照片来源从空间选图复制 复制完成后打开相册开始骚操作(两种方式) OK

  7. 关于QQ空间相册功能的构想与简单实现

    QQ空间上传照片对其可以分类,形成不同的相册,这对于用户体验来说是很不错的,如果用户只能上传不加以分类,那么用户体验会很差. 下面是自己关于相册功能实现的一些简单看法: 首先,是创建相册,可以用pan ...

  8. selenium firefox 提取qq空间相册链接

    环境: selenium-java 3.9.1 firefox 57.0 geckodriver 0.19.1 1.大概的思路就是模拟用户点击行为,关于滚动条的问题,我是模拟下拉箭头,否则只能每个相册 ...

  9. 抓取QQ空间相册

    某天,想下载某人的相册,发现一张一张下载,工作量巨大,所以写了这个工具. 使用到的工具 Fiddler(抓包工具) python(脚本语言) intellij 步骤 分析包 获取相册分类链接信息 打开 ...

随机推荐

  1. Java配置

    JAVA_HOME -- JDK安装的路径 PATH -- 加入:;%JAVA_HOME%\bin; CLASSPATH -- 加入:;%JAVA_HOME%\lib\dt.jar;%JAVA_HOM ...

  2. MVCC 多版本并发控制

    关于事务的介绍暂且不谈. InnoDB行级锁,虽然在很大程度上提高了事务的并发性,但是终究还是要耗费很大的.为了更进一步的提高并发性同时降低开销,存储引擎会同时实现MVCC. InnoDB实现MVCC ...

  3. IT第五天 - 循环的使用、本周总结 ★★★

    IT第五天 上午 循环 1.while循环.do-while循环.switch语句块的使用 下午 编程 1.编程注释的编写 2.编程力求代码的精简,算法的优化 3.变量的优化使用 小项目 1.swit ...

  4. 戴尔CEO:我们将专注于企业 而非手机业务

    9月13日消息,据国外媒体报道,戴尔公司董事长兼首席执行官迈克尔·戴尔(Michael Dell)周五接受了CNBC采访,谈了他对戴尔未来的打算.此前一天,迈克尔·戴尔提出的以250亿美元将戴尔私有化 ...

  5. Girls' research(manacher)

    Girls' research Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  6. POJ 1330 Nearest Common Ancestors LCA题解

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19728   Accept ...

  7. switch case ,while, do while,enum

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑 ...

  8. 一道TOPK问题

    今天遇到一道TOP k的变形题,题目大概意思是有10W个随机整数,然后对这些数进行如下操作: 1.当能被3整除时,将此数替换为此数和其它数两两相加的数,包括数本身 2.当不能被3整除时,将此数替换为原 ...

  9. android -- 蓝牙 bluetooth (二) 打开蓝牙

    4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...

  10. akka actor中的基本概念(学习小结)

    注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...