summaryrefslogtreecommitdiff
path: root/api.txt
blob: 40b0ed305a88cbc90c4881f9ffb4b23a0a146390 (plain)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
                        __ __             __
                       / // / ____ ____  / /_
                      / // /_/ __ `/ _ \/ __/
                     /__  __/ /_/ /  __/ /_ 
                       /_/  \__, /\___/\__/
                           /____/         

           + Welcome to the 4get API documentation +

+ Terms of use
    Do NOT misuse the API. Misuses can include... ::
    
        1. Serp SEO scanning
        2. Intensive scraping
        3. Any other activity that isn't triggered by a human
        4. Illegal activities in Canada
        5. Constant "test" queries while developping your program
           (please cache the API responses!)


    Examples of good uses of the API ::
        
        1. A chatroom bot that presents users with search results
        2. Personal use
        3. Any other activity that is initiated by a human


    If you wish to engage in the activities listed under "misuses", feel
    free to download the source code of the project and running 4get
    under your own terms. Please respect the terms of use listed here so
    that this website may be available to all in the far future.

    Get your instance running here ::
        https://git.lolcat.ca/lolcat/4get

    Thanks!


+ Decode the data
    All payloads returned by the API are encoded in the JSON format. If
    you don't know how to tackle the problem, maybe programming is not
    for you.
    
    All of the endpoints use the GET method.


+ Check if an API call was successful
    All API responses come with an array index named "status". If the
    status is something else than the string "ok", something went wrong.
    
    The HTTP code will always be 200 as to not cause issues with CORS.


+ Get the next page of results
    All API responses come with an array index named "nextpage". To get
    the next page of results, you must make another API call with &npt.
    
    Example ::
        
        + First API call
            /api/v1/web?s=higurashi
        
        + Second API call
            /api/v1/web?npt=ddg1._rJ2hWmYSjpI2hsXWmYajJx < ... >
    
    You shouldn't specify the search term, only the &npt parameter
    suffices.
    
    The first part of the token before the dot (ddg1) refers to an
    array position on the serber's memory. The second part is an
    encryption key used to decode the data at that position. This way,
    it is impossible to supply invalid pagination data and it is
    impossible for a 4get operator to peek at the private data of the
    user after a request has been made.
    
    The tokens will expire as soon as they are used or after a 15
    minutes inactivity period, whichever comes first.


+ Beware of null values!
    Most fields in the API responses can return "null". You don't need
    to worry about unset values.


+ API Parameters
    To construct a valid request, you can use the 4get web interface
    to craft a valid request, and replace "/web" with "/api/v1/web".


+ "date" and "time" parameters
    "date" always refer to a calendar date.
    "time" always refer to the duration of some media.
    
    They are both integers that uses seconds as its unit. The "date"
    parameter specifies the number of seconds that passed since January
    1st 1970. 
    

             ______          __            _       __      
            / ____/___  ____/ /___  ____  (_)___  / /______
           / __/ / __ \/ __  / __ \/ __ \/ / __ \/ __/ ___/
          / /___/ / / / /_/ / /_/ / /_/ / / / / / /_(__  ) 
         /_____/_/ /_/\__,_/ .___/\____/_/_/ /_/\__/____/  
                          /_/                              

+ /api/v1/web
    + &extendedsearch
        When using the ddg(DuckDuckGo) scraper, you may make use of the
        &extendedsearch parameter. If you need rich answer data from
        additional sources like StackOverflow, music lyrics sites, etc.,
        you need to specify the value of (string)"true".
        
        The default value is "false" for API calls.
    
    
    + Parse the "spelling"
        The array index named "spelling" contains 3 indexes ::
            
            spelling:
                type:         "including"
                using:        "4chan"
                correction:   '"4cha"'
        
        
        The "type" may be any of these 3 values. When rendering the
        autocorrect text inside your application, it should look like
        what follows right after the parameter value ::
            
            no_correction    <Empty>
            including        Including results for %using%. Did you mean
                             %correction%?
                            
            not_many         Not many results for %using%. Did you mean
                             %correction%?
        
        
        As of right now, the "spelling" is only available on
        "/api/v1/web".
        
    
    + Parse the "answer"
        The array index named "answer" may contain a list of multiple
        answers. The array index "description" contains a linear list of
        nodes that can help you construct rich formatted data inside of
        your application. The structure is similar to the one below:
        
        answer:
            0:
                title: "Higurashi"
                description:
                    0:
                        type:     "text"
                        value:    "Higurashi is a great show!"
                    1:
                        type:     "quote"
                        value:    "Source: my ass"
        
        
        Each "description" node contains an array index named "type".
        Here is a list of them:
            
              text
            + title
              italic
            + quote
            + code
              inline_code
              link
            + image
            + audio
        
        
        Each individual node prepended with a "+" should be prepended by
        a newline when constructing the rendered description object.
        
        There are some nodes that differ from the type-value format.
        Please parse them accordingly ::
            
            + link
                type:     "link"
                url:      "https://lolcat.ca"
                value:    "Visit my website!"
            
            
            + image
                type:    "image"
                url:     "https://lolcat.ca/static/pixels.png"
            
            
            + audio
                type:    "audio"
                url:     "https://lolcat.ca/static/whatever.mp3"
        
        
        The array index named "table" is an associative array. You can
        loop over the data using this PHP code, for example ::
            
            foreach($table as $website_name => $url){ // ...
        
        
		The rest of the JSON is pretty self explanatory.
        
        
+ /api/v1/images
    All images are contained within "image". The structure looks like
    below ::
        
        image:
            0:
                title: "My awesome Higurashi image"
                source:
                    0:
                        url: "https://lolcat.ca/static/profile_pix.png"
                        width: 400
                        height: 400
                    1:
                        url: "https://lolcat.ca/static/pixels.png"
                        width: 640
                        height: 640
                    2:
                        url: "https://tse1.mm.bing.net/th?id=OIP.VBM3BQg
                        euf0-xScO1bl1UgHaGG"
                        width: 194
                        height: 160
        
    
    The last image of the "source" array is always the thumbnail, and is
    a good fallback to use when other sources fail to load. There can be
    more than 1 source; this is especially true when using the Yandex
    scraper, but beware of captcha rate limits.
    
    
+ /api/v1/videos
    The "time" parameter for videos may be set to "_LIVE". For live
    streams, the amount of people currently watching is passed in
    "views".


+ /api/v1/news
    Just make a request to "/api/v1/news?s=elon+musk". The payload
    has nothing special about it and is very self explanatory, just like
    the endpoint above.


+ /api/v1/music
    Each entry under "song" contains a array index called "stream" that
    looks like this ::
    
        endpoint: audio_sc
        url: https://api-v2.soundcloud <...>
    
    
    When the endpoint is "audio_sc", you MUST use 4get's audio_sc
    endpoint, for example, if you want an audio stream back. Otherwise,
    you are free to handle the json+m3u8 crap yourself. If the endpoint
    is equal to "audio", that URL SHOULD return a valid HTTP audio
    stream, and using the "audio" endpoint becomes optional again.


+ /favicon
    Get the favicon for a website. The only parameter is "s", and must
    include the protocol.
    
    Example ::
        
        /favicon?s=https://lolcat.ca
    
    
    If we had to revert to using Google's favicon cache, it will throw
    an error in the X-Error header field. If Google's favicon cache
    also failed to return an image, or if you're too retarded to specify
    a valid domain name, a default placeholder image will be returned
    alongside the "404" HTTP error code.


+ /proxy
    Get a proxied image. Useful if you don't want to leak your user's IP
    address. The parameters are "i" for the image link and "s" for the
    size.
    
    Acceptable "s" parameters:
        
        portrait     90x160
        landscape    160x90
        square       90x90
        thumb        236x180
        cover        207x270
        original     <Original resolution>
	
    You can also ommit the "s" parameter if you wish to view the
    original image. When an error occurs, an "X-Error" header field
    is set.


+ /audio
    Get a proxied audio file. Does not support "Range" headers, as it's
    only used to proxy small files.
    
    The parameter is "s" for the audio link.


+ /audio_sc
    Get a proxied audio file for SoundCloud. Does not support downloads
    trough WGET or CURL, since it returns 30kb~160kb "206 Partial
    Content" parts, due to technical limitations that comes with
    converting m3u8 playlists to seekable audio files. If you use this
    endpoint, you must support these 206 codes and also handle the
    initial 302 HTTP redirect. I used this method as I didn't want to
    store information about your request needlessly. This method also
    allows noJS users to access the files.
    
    The parameter is "s" for the SoundCloud JSON m3u8 abomination. It
    does not support "normal" SoundCloud URLs at this time.


+ Appendix
    If you have any questions or need clarifications, please send an
    email my way to will at lolcat.ca