源码和程序在文章结尾处有下载

由来

非常喜欢豆瓣FM
非常喜欢豆瓣FM
非常喜欢豆瓣FM 重要的事说三遍 作为一个程序猿 , 想要什么还不是信手拈来? 于是乎 , 在没有用得习惯的豆瓣FM客户端的时候 ,我开始自己写客户端了. 这个客户端在去年就完成了 , 发表在以前博客的过 . 在4月决定自己用java写博客程序 , 所以也就停止以前的博客 .不过还是用回来wp.(自己写的也完成了codeinfo.me) .

简介

使用C#完成的豆瓣FM第三方客户端

界面风格/操作与网页版基本相同

可以选择赫兹列表、登录用户并且对对歌曲红心/不再听/下载等操作

原理

由于豆瓣FM是不公开API的 , 但是不公开就没有吗? 网上大神通过抓包把基本功能API都获取到了.于是我就基于现成的API写的.如果感兴趣可以去看看我使用的接口 : gitgub

使用

软件首次启动会在系统中的最大磁盘新建一个名为 “SimpleFM_Music” 的文件夹存放下载的音乐

只有登录用户才可对歌曲进行红心/不再听操作

双击封面显示赫兹列表,单击赫兹名称选择赫兹并显示封面

快捷键

Alt+Shift+C 关闭软件

Alt+Shift+S 显示/隐藏软件

Alt+Shift+N 切歌

Alt+Shift+U 不再听

Alt+Shift+L 添加或取消红心

Alt+Shift+H 显示行赫兹列表

Alt+Shift+P 播放/暂停

Alt+Shift+D 打开登录界面

Alt+Shift+D 打开登录界面

Alt+Shift+X 下载当前歌曲

Ctrl+Alt+Up 增大音量

Ctrl+Alt+Down 降低音量

截图

软件启动后的主界面

主界面


登录界面

登录界面


赫兹列表

赫兹列表


播放音乐

播放音乐

加红心

加红心


音量控制

音量控制


暂停播放

暂停播放

代码

类比较多 , 就贴豆瓣FM处理的类



using System;
using System.Net;
using System.IO;
using System.Text;

namespace DesireFM
{
    /// <summary>
    /// FM歌曲相关操作类
    /// 获取歌曲
    /// 获取赫兹
    /// 暂停歌曲
    /// 下一首
    /// 红心/取消红心
    /// 不再听
    /// 下载当前歌曲
    /// </summary>
    class FMUtil
    {

        #region 需要重复使用的变量


        /// <summary>
        /// 需要用到的地址
        /// </summary>
        private static string url;

        /// <summary>
        /// 请求响应对象
        /// </summary>
        private static WebClient client;

        /// <summary>
        /// JSON结果
        /// </summary>
        private static string jsonStr;

        #endregion


        #region 用户登录
        /// <summary>
        /// 用户登录
        /// </summary>
        /// <returns></returns>
        public static string Login()
        {
            //登录地址
             url= String.Format("http://www.douban.com/j/app/login?app_name=radio_desktop_win&version=100&email={0}&password={1}",UserEntity.email,UserEntity.password);

            client = new WebClient();
            client.Credentials = CredentialCache.DefaultCredentials;
            //模拟IE的方式访问
            client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
            client.Encoding = new UTF8Encoding();
            jsonStr = client.DownloadString(url);
            //返回的Cookie.用来获取红心列表
            Global.Cookie = client.ResponseHeaders.Get("Set-Cookie");

            return jsonStr;
        }
        #endregion


        #region 获取所有赫兹

        /// <summary>
        /// 获取所有赫兹
        /// </summary>
        public static string getChances()
        {
            url = "http://www.douban.com/j/app/radio/channels";
            client=new WebClient();
            client.Credentials = CredentialCache.DefaultCredentials;
            //模拟IE的方式访问
            client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
            client.Encoding = new UTF8Encoding();
            jsonStr = client.DownloadString(url);
            return jsonStr;
        }
        #endregion


        #region 歌曲操作
        /// <summary>
        /// 歌曲操作
        /// </summary>
        /// <param name="channel_id"></param>
        public static String getSongs(int channel_id,string type,string sid)
        {
            //获取新歌曲
            if (type.Equals("n"))
            {

                if(UserEntity.userName!=null)
                    url = string.Format("http://www.douban.com/j/app/radio/people?type=n&app_name=radio_desktop_win&version=100&channel={0}&user_id={1}&expire={2}&token={3}", channel_id, UserEntity.userId, UserEntity.expire, UserEntity.token);
                else
                    url = string.Format("http://www.douban.com/j/app/radio/people?app_name=radio_desktop_win&version=100&type=n&channel={0}", channel_id);

                client = new WebClient();
                client.Credentials = CredentialCache.DefaultCredentials;
                //模拟IE的方式访问
                client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
                client.Encoding = new UTF8Encoding();
                jsonStr = client.DownloadString(url);
            }
                //不再听
            else if (type.Equals("b"))
            {
                url = string.Format("http://www.douban.com/j/app/radio/people?app_name=radio_desktop_win&version=100&sid={0}&type=b&user_id={1}&expire={2}&token={3}&channel={4}", sid, UserEntity.userId, UserEntity.expire, UserEntity.token, channel_id);
                client = new WebClient();
                client.Credentials = CredentialCache.DefaultCredentials;
                //模拟IE的方式访问
                client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
                client.Encoding = new UTF8Encoding();
                jsonStr = client.DownloadString(url);
            }
                //加红心
            else if (type.Equals("r"))
            {
                url = string.Format("http://www.douban.com/j/app/radio/people?app_name=radio_desktop_win&version=100&sid={0}&type=r&user_id={1}&expire={2}&token={3}&channel={4}", sid, UserEntity.userId, UserEntity.expire, UserEntity.token,channel_id);
                client = new WebClient();
                client.Credentials = CredentialCache.DefaultCredentials;
                //模拟IE的方式访问
                client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
                client.Encoding = new UTF8Encoding();
                jsonStr = client.DownloadString(url);
            }
                //取消红心
            else if(type.Equals("u"))
            {
                url = string.Format("http://www.douban.com/j/app/radio/people?app_name=radio_desktop_win&version=100&sid={0}&type=u&user_id={1}&expire={2}&token={3}&channel={4}", sid, UserEntity.userId, UserEntity.expire, UserEntity.token, channel_id);
                client = new WebClient();
                client.Credentials = CredentialCache.DefaultCredentials;
                //模拟IE的方式访问
                client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
                client.Encoding = new UTF8Encoding();
                jsonStr = client.DownloadString(url);
            }

            return jsonStr;
        }
        #endregion


        #region 下载单首
        /// <summary>
        /// 下载单首流并播放
        /// </summary>
        /// <param name="songUrl"></param>
        /// <returns></returns>
        public static void downOneSongStream()
        {
            client = new WebClient(); 
            client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
            client.Encoding = new UTF8Encoding();
            client.DownloadFile(Global.Songs[frmMain.SongListIndex].url, Global.downLoadPath+"/" + Global.Songs[frmMain.SongListIndex].title+".mp3");
        }
        #endregion


        #region 得到流
        /// <summary>
        /// 得到流
        /// </summary>
        /// <param name="streamUrl"></param>
        /// <returns></returns>
        public static Stream downStream(string streamUrl)
        {
            client = new WebClient();
            client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
            client.Encoding = new UTF8Encoding();
            return client.OpenRead(streamUrl);
        }
        #endregion

        #region 获取红心列表

        public static void GetRedHreats()
        {
            //登录地址
            url = String.Format("http://douban.fm/mine#!type=liked&start=1");

            client = new WebClient();
            client.Credentials = CredentialCache.DefaultCredentials;
            //模拟IE的方式访问
            client.Headers.Add("User-Agent", "Microsoft Internet Explorer");
            client.Headers.Add("Cookie",Global.Cookie);
            client.Encoding = new UTF8Encoding();
            jsonStr = client.DownloadString(url);
        }
        #endregion
    }
}

如果有bug可以随时提出来 .^_^

需要.Net 4 或 以上的环境

下载

程序 : http://pan.baidu.com/s/1kTMm6oB 密码:zdqx

源码+程序(1) : https://github.com/joylyl/DesireFM

源码+程序(2) : http://pan.baidu.com/s/1c0xytY4 密码:d0ok