[原创]linux下cctv5直播表(大家多多支持哈)

由本社区发起的开源项目
回复
scu_guzo
帖子: 52
注册时间: 2007-05-11 22:52
来自: 四川大学
送出感谢: 0
接收感谢: 0
联系:

[原创]linux下cctv5直播表(大家多多支持哈)

#1

帖子 scu_guzo » 2009-05-30 21:51

改了下,应该可以了。
其实原理就是从cctv的网站上下载html文本然后解析出来,这次用了自动机,应该没问题了

代码: 全选

/*
  Linux下cctv5直播表。
    文件:cctv5.c   编译:gcc cctv5.c -o cctv5
    运行:./cctv5 20090603
    注意:参数必须是以上格式,如20091010,没太多的错误检测,使用小心!
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <libintl.h>
#include <iconv.h>

#define TAIL ".shtml HTTP/1.1\r\nHOST:tv.cctv.com\r\nUser-Agent:Mozilla/4.0\r\n\r\n"

static char items[1000], res[1000];
static int sockfd, line = 1;
const char am_i[] = { 201, 207, 206, 231, 189, 218, 196, 191, 0 };
const char pm_i[] = { 207, 194, 206, 231, 189, 218, 196, 191, 0 };

int create_tcp_socket ( const char *addr, unsigned short port_num,
                        int *fd )
{
    int len, result;
    struct sockaddr_in address;
    struct hostent *hostinfo;
    hostinfo = gethostbyname ( addr );
    if ( !hostinfo )
        return -1;
    address.sin_family = AF_INET;
    address.sin_addr = *( struct in_addr * ) *hostinfo->h_addr_list;
    address.sin_port = htons ( port_num );
    *fd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( connect
         ( *fd, ( struct sockaddr * ) &address,
           sizeof ( address ) ) == -1 )
        return -1;
    return 0;
}

static void gbk2utf8 (  )
{
    char *inbuf, *outbuf;
    iconv_t iconvd;
    int l1, l2;

    outbuf = &res;
    inbuf = &items;
    l1 = l2 = 1000;

    iconvd = iconv_open ( "utf-8", "gbk" );
    iconv ( iconvd, &inbuf, &l1, &outbuf, &l2 );
    iconv_close ( iconvd );
}

static void parse_line (  )
{
    int i, l1, l2;
    char ch;
    char *inbuf, *outbuf;
    iconv_t iconvd;
    i = strlen ( items );

    do
    {
        read ( sockfd, ( char * ) &ch, 1 );
        if ( ch == '<' )
        {
            if ( i > 0 && items[i - 1] != '\n' )
            {
                items[i] = '\n';
                ++i;
            }
            while ( ch != '>' )
                read ( sockfd, ( char * ) &ch, 1 );
        }
        else
        {
            items[i] = ch;
            ++i;
        }
    } while ( ch != '\n' );
    items[i] = 0;
}

static void parse_am (  )
{
    int i;
    char ch;
    
    i = 0;
    while ( read ( sockfd, ( char * ) &ch, 1 ) > 0 )
    {
        if ( ch == am_i[i] )
        {
            ++i;
            if ( i == 8 )
                break;
        }
        else
            i = 0;
    }

    items[0] = 0;
    strcat ( items, am_i );

    parse_line (  );

    gbk2utf8 (  );
}

static void parse_pm (  )
{
    int i;
    char ch;

    i = 0;
    while ( read ( sockfd, ( char * ) &ch, 1 ) > 0 )
    {
        if ( ch == pm_i[i] )
        {
            ++i;
            if ( i == 8 )
                break;
        }
        else
            i = 0;
    }

    int j = 2;
    while ( j )
    {
        read ( sockfd, ( char * ) &ch, 1 );
        if ( ch == 10 )
            j--;
    }

    items[0] = 0;
    strcat ( items, pm_i );
    strcat ( items, "(12:00-24:00)" );

    parse_line (  );

    gbk2utf8 (  );
}

int main ( int argc, char **argv )
{
    char t[100] = { "GET /soushi/28/07/" };
    int i;
    char ch;

    if ( create_tcp_socket ( "tv.cctv.com", 80, &sockfd ) < 0 )
    {
        fprintf ( stderr, "Create socket error\n" );
        return 1;
    }

    strcat ( t, argv[1] );
    strcat ( t, TAIL );
    write ( sockfd, t, strlen ( t ) );

    parse_am (  );
    printf ( "%s\n", res );
    parse_pm (  );
    printf ( "%s\n", res );

    close ( sockfd );

    return 0;
}

上次由 scu_guzo 在 2009-06-21 14:50,总共编辑 2 次。
头像
James_true
帖子: 14
注册时间: 2009-05-29 10:15
送出感谢: 0
接收感谢: 0

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#2

帖子 James_true » 2009-05-30 22:51

C语言写的啊
Java资深技术顾问,在线QQ:22550450
xjzhou
帖子: 16
注册时间: 2008-04-28 10:57
送出感谢: 0
接收感谢: 0
联系:

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#3

帖子 xjzhou » 2009-06-01 10:53

环境: gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
编译除了一些警告,通过。但运行出错。

~/workspace/c_c++$ ./cctv5 20090603
段错误
scu_guzo
帖子: 52
注册时间: 2007-05-11 22:52
来自: 四川大学
送出感谢: 0
接收感谢: 0
联系:

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#4

帖子 scu_guzo » 2009-06-21 14:49

大家再试试哈 :em01
saberqin
帖子: 248
注册时间: 2009-03-27 22:39
送出感谢: 0
接收感谢: 0

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#5

帖子 saberqin » 2009-07-19 22:13

:em11
头像
nchacker
帖子: 7
注册时间: 2009-08-21 18:06
来自: 湖南科技大学
送出感谢: 0
接收感谢: 0
联系:

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#6

帖子 nchacker » 2009-08-22 10:59

编译有些警告,测试通过。 收藏了。 改天好好看看~!

最近才开始LINUX下C,呵呵。 搂主要是牛人,可要带俺一把阿~呵呵~!

:em06
头像
haoyihuan
帖子: 271
注册时间: 2009-06-11 13:37
送出感谢: 1 次
接收感谢: 0

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#7

帖子 haoyihuan » 2009-10-01 20:46

xjzhou 写了:环境: gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
编译除了一些警告,通过。但运行出错。

~/workspace/c_c++$ ./cctv5 20090603
段错误
# gcc cctv.c -o cctv
cctv.c: 在函数‘gbk2utf8’中:
cctv.c:49: 警告: 从不兼容的指针类型赋值
cctv.c:50: 警告: 从不兼容的指针类型赋值
cctv.c:54: 警告: 传递‘iconv’的第 3 个参数时在不兼容的指针类型间转换
cctv.c:54: 警告: 传递‘iconv’的第 5 个参数时在不兼容的指针类型间转换
cctv.c: 在函数‘parse_line’中:
cctv.c:64: 警告: 隐式声明与内建函数‘strlen’不兼容
cctv.c: 在函数‘parse_am’中:
cctv.c:107: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c: 在函数‘parse_pm’中:
cctv.c:141: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c: 在函数‘main’中:
cctv.c:161: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c:163: 警告: 隐式声明与内建函数‘strlen’不兼容
跑debian应该是有点搞头的吧。
头像
luofeng1989
帖子: 766
注册时间: 2009-09-20 19:30
系统: ubuntu12.04
来自: GIS
送出感谢: 0
接收感谢: 0

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#8

帖子 luofeng1989 » 2010-01-09 19:00

看来是个编程牛人啊。。。 :em09
头像
黄美姬
论坛版主
帖子: 8428
注册时间: 2009-10-08 11:15
来自: 大城市铁岭
送出感谢: 0
接收感谢: 1 次

Re: [原创]linux下cctv5直播表(大家多多支持哈)

#9

帖子 黄美姬 » 2010-01-09 19:12

MARK
我们是命运的妓女,它把我们都嫖了

N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal- ... ts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal- ... tx-450-ops
:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\[email protected]\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/
回复

回到 “开源小工具”