C++ & PCRE & Вконтакте + Музыка

Набросок парсера для получения ссылок на музыкальные произведения и их названия, в социальной сети ВКонтакте.
Возможно будет в дальнейшем использован в VKFS (Файловая Системы Вконтакте.)

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>

#include <pcre.h>
#include <string.h>
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>


using namespace cURLpp;
using namespace Options;
using namespace types;


using namespace std;


string RequestAnswer;
char *Answer;

size_t WriteMemoryCallback(char* ptr, size_t size, size_t nmemb)
{
  int FullSize = size*nmemb;
  RequestAnswer.append(ptr,FullSize);
 
  return FullSize;
}

std::string GetContent (string url)
{
  curlpp::Easy request;
  request.setOpt( Url(url) );
  request.setOpt( UserAgent("VkFS") );
  request.setOpt(Cookie("remixsid=YOUR_SESSION_COOKIE;"));


  WriteFunctionFunctor functor(WriteMemoryCallback);
  WriteFunction* cb = new curlpp::options::WriteFunction(functor);
  request.setOpt(cb);

  request.perform();

  return RequestAnswer;
}

string GetParse(char *pattern_mus, const char *content, int items=0)
{

    pcre *re;
    const char *error;
    int erroffset;
    string m_file;
    m_file = "";

    re = pcre_compile(pattern_mus, PCRE_CASELESS, &error, &erroffset, NULL);

    if (!re)
    {
         cout << "Fail\n";
    }
    else
    {
        int count = 0;
        int ovector[60];
        int j;
        j=0;
        while ((count  =  pcre_exec (re,  0, content, strlen(content), j, PCRE_NOTEMPTY, ovector, 60))>=0)
        {
            if(items == 0)
            {
                for (int i=ovector[0]; i<ovector[1]; i++)
                {
                    m_file += content[i];
                }

                m_file +="\n";
                j=ovector[1]+1;
            }
            else
            {
                for (int i=ovector[items]; i<ovector[items+1]; i++)
                {
                    m_file += content[i];
                }

                m_file +="\n";
                j=ovector[1]+1;
            }
        }

        return m_file;

    }

}

int main()

{

    char *pattern_mus = "http:\/\/cs(.*?).vkontakte.ru\/(.*?)\/audio\/(.*?).mp3";
    char *pattern_title = "q\]\=.*?>(.*?)<\/a><\/b>";
    char *url = "http://vkontakte.ru/audio.php";
    cout << GetParse(pattern_mus, GetContent(url).c_str());
    cout << GetParse(pattern_title, GetContent(url).c_str(), 2);
    return 0;
}

Makefile:

1
2
3
4
5
vkmusic: main.o
    g++ -d -lpcre -lcurlpp -w main.o -o vkmusic

main.o: main.cpp
    g++ -w -c main.cpp -o main.o -D_FILE_OFFSET_BITS=64

2 Replies to “C++ & PCRE & Вконтакте + Музыка”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *