socket编程--搜索百度歌曲

刚看到一篇关于百度音乐接口的文章:



http://blog.csdn.net/wangjintao1988/article/details/8003573,这个里面说明了实现思路,并且编码方式的转换是基于Java的。最近正在学习linux socket编程,因此想通过linux实现这个功能,字体编码从GB2312到ASCII字符的转换时曾经尝试用iconv,但一直无法正确转换,自己写了一个函数。

这个code如下:down.c

<pre class="cpp" name="code">#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <iconv.h>
#define MAX_SIZE 1024
#define SEVER_PORT 80
/*
*将GB3212格式转换为ASCII字符,并且在其中插入服务器需要的%
*/
int zh2b(char *inbuf,int inbytes,char *outbuf,int outbytes)
{
        int len = 0;
        char ch[8];
        int i;
        printf("\n===========ascii===========\n");
        for(i=0;i<inbytes;i++)
        {
                sprintf(ch,"%0x",inbuf[i]);
                outbuf[len++] = '%';
                outbuf[len++] = ch[6];
                outbuf[len++] = ch[7];
        }
        outbuf[len] = '\0';
        for(i=0;i<len;i++)
        {
                if(outbuf[i]>='a'&&outbuf[i]<='z')
                        outbuf[i] -= 32;
        }
        printf("\n===============end================\n");
        printf("%s\n",outbuf);
}
/*
* 向服务器发送的GET请求
*/
void obtion_head_msg(const char *music,const char *artist,char *head_msg)
{

        sprintf(head_msg,"GET /x?op=12&count=1&title=");
        strcat(head_msg,music);
        strcat(head_msg,"$$");
        strcat(head_msg,artist);
        strcat(head_msg,"$$$$");
        strcat(head_msg," HTTP/1.1\n");
        strcat(head_msg,"Host: box.zhangmen.baidu.com\n");
        strcat(head_msg,"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0\n");
        strcat(head_msg,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n");
        strcat(head_msg,"Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\n");
        strcat(head_msg,"Accept-Encoding: gzip, deflate\n");
        strcat(head_msg,"Connection:close\n\n");

}
int main(int argc,char* argv[])
{
        int sockfd,numbytes;
        char buf[MAX_SIZE];
        struct hostent *h;
        char requestMsg[MAX_SIZE]={'\n'};
        char music[64];

        char artist[64];
        int music_len=64;
        int artist_len=64;
        struct sockaddr_in sever_addr;
        if(argc != 3)
        {
                fprintf(stderr,"please input music info:example\n\n ./down music artist \n\n");
                exit(1);
        }

        zh2b(argv[1],strlen(argv[1]),music,music_len);
        zh2b(argv[2],strlen(argv[2]),artist,artist_len);
        printf("before:music:%s,artist:%s\n",argv[1],argv[2]);
        printf("after: music:%s,artist:%s\n",music,artist);

        if((h=gethostbyname("box.zhangmen.baidu.com")) == NULL)
        {
                herror("gethostbyname");
                exit(1);
        }

        printf("Host name :%s\n",h->h_name);
        printf("IP Address:%s",inet_ntoa(*((struct in_addr *)h->h_addr)));
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
        {
                perror("socket error\n");
                goto ERROR_;
        }

        sever_addr.sin_family = AF_INET;
        sever_addr.sin_port = htons(SEVER_PORT);
        sever_addr.sin_addr = *((struct in_addr *)h->h_addr);
        bzero(&(sever_addr.sin_zero),8);

        if(connect(sockfd,(struct sockaddr *)&sever_addr,sizeof(struct sockaddr)) == -1)
        {
                perror("connect error \n");
                goto ERROR_;
        }

        obtion_head_msg(music,artist,requestMsg);
        printf("%s\n",requestMsg);

        if(send(sockfd,requestMsg,strlen(requestMsg),0)==-1)
        {
                perror("send error \n");
                goto ERROR_;
        }

        numbytes = recv(sockfd,buf,MAX_SIZE,0);
        if(numbytes == -1)
        {
                perror("recv error\n");
                goto ERROR_;
        }
        printf("\n\n=============================start html=======================\n\n");
      while(numbytes > 0)
        {
                printf("%s",buf);
                numbytes = recv(sockfd,buf,MAX_SIZE,0);
        }
        printf("\n\n=============================end html=======================\n\n");
        return 0;
ERROR_:
        exit(1);

}

之后编译:gcc -o down down.c

./down 童话 光良

便可以下载百度服务器发送过来的html,可以根据其中的内容结合这篇文档http://blog.csdn.net/wangjintao1988/article/details/8003573,进行解析出歌曲的下载路径,然后再次用socket或者其他编程方式下载。

注意事项

1.服务器GET请求中,汉字必须转化为ASCII字符并且用%隔开,如:童话(%E7%AB%A5%E8%AF%9D),光良(%E5%85%89%E8%89%AF),括号中是服务器识别的格式

2.GET请求的格式:

GET /x?op=12&count=1&title=%E7%AB%A5%E8%AF%9D$$%E5%85%89%E8%89%AF$$$$ HTTP/1.1

Host: box.zhangmen.baidu.com

User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection:close

这个可以在火狐浏览器中通过firebug插件查看你发送的GET请求,如下图:输入http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E7%AB%A5%E8%AF%9D$$%E5%85%89%E8%89%AF$$$$



socket编程--搜索百度歌曲,布布扣,bubuko.com

时间: 2024-10-10 08:28:39

socket编程--搜索百度歌曲的相关文章

Linux socket编程 DNS查询IP地址

本来是一次计算机网络的实验,但是还没有完全写好,DNS的响应请求报文的冗余信息太多了,不只有IP地址.所以这次的实验主要就是解析DNS报文.同时也需要正确的填充请求报文.如果代码有什么bug,欢迎指正啊.代码排版有点乱... 本文有以下内容 DNS报文的填充和解析 利用socket API传输信息 一.填充DNS请求报文 随便百度一下,就可以知道DNS报文的格式.所以这里只介绍如何填充DNS报文. 首先是填充报文首部: ? 1 2 3 4 5 6 7 8 9 /* 填充首部的格式大致相同,下面的

PHP SOCKET编程

1. 预备知识 一直以来很少看到有多少人使用PHP的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实php的socket模块可以做很多事情,包括做ftplist,http post提交,smtp提交,组包并进行特殊报文的交互(如smpp协议),whois查询.这些都是比较常见的查询. 特别是php的socket扩展库可以做的事情简直不会比c差多少.php的socket连接函数1.集成于内核的socket这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能.而且

简单理解php的socket编程

php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络服务的客户端和服务端,这和mysql的客户端和服务端是一样的,你只要理解mysql的客户端和服务端是怎么一回事,你就应该能够理解下面我要讲的东西吧. 关于socket编程所涉及到的网络协议,什么TCP啊,UDP啊,什么socket三次握手等等,这些网络协议网上有很详细的解释,这里不讲,只截个sock

【python】socket编程常量错误问题-1 &#39;AF_INET&#39;错误

1 2 3 4 5 6 7 8 9 # -*- coding: utf-8 -*- import socket print "Creating socket" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  print "Done!" print "Connecting to remote host..." s.connect(("www.baidu.com", 8

Python异步Socket编程

异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为Python有个非常出名的异步Lib:Twisted,所以就用Python来完成. OK,首先写一个pythone socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行.这太麻烦了,就分别用三个Thread来运行这些services. Java代码   import optp

linux网络编程1 最简单的socket编程

下面是socket编程的服务器端 先看一个图,1 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> //针对系统调用的封装 fork,pipe 各种i/o原语 read write 等 5 6 #include<sys/socket.h> 7 #include<netinet/in.h> //互联网地址族 定义数据结构s

socket编程 123

1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实php的socket模块可以做很多事情,包括做ftplist,http post提交,smtp提交,组包并进行特殊报文的交互(如smpp协议),whois查询.这些都是比较常见的查询. 特别是php的socket扩展库可以做的事情简直不会比c差多少.php的socket连接函数1.集成于内核的socket这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能.而且

Android必备:Android Socket编程的了解与学习整理

看这里:Android必备:Android Socket编程的了解与学习整理 最近学习Android的过程中,由于项目.业务等因素影响,服务端通过Socket进行通信,于是开始学习Socket编程,之前的开发中,很少涉及此 方面的知识学习,本篇就来简单的整理一下,通过Android客户端进行Socket登录的demo,来进行Adnroid Socket编程的学习. 在开始学习之前,先来了解一下Socket,以下内容来自百度百科: 通常也称作"套接字",用于描述IP地址和端口,是一个通信

Linux网络编程视频 百度网盘

Linux网络编程(总共41集)讲解Linux网络编程知识,分以下四个篇章.Linux网络编程之TCP/IP基础篇Linux网络编程之socket编程篇Linux网络编程之进程间通信篇Linux网络编程之线程篇Linux网络编程之TCP/IP基础篇01TCPIP基础(一)ISO/OSI参考模型TCP/IP四层模型基本概念(对等通信.封装.分用.端口)02TCPIP基础(二)最大传输单元(MTU)/路径MTU以太网帧格式ICMPARPRARP03TCPIP基础(三)IP数据报格式网际校验和路由04