My favorites | Sign in
Project Home Downloads Wiki Issues Source
Repository:
Checkout   Browse   Changes   Clones    
 
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
#!/bin/bash
#
# dl.free.fr module
# Copyright (c) 2010-2012 Plowshare team
#
# This file is part of Plowshare.
#
# Plowshare is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Plowshare is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Plowshare. If not, see <http://www.gnu.org/licenses/>.

MODULE_DL_FREE_FR_REGEXP_URL="http://dl.free.fr/"

MODULE_DL_FREE_FR_DOWNLOAD_OPTIONS=""
MODULE_DL_FREE_FR_DOWNLOAD_RESUME=yes
MODULE_DL_FREE_FR_DOWNLOAD_FINAL_LINK_NEEDS_COOKIE=yes

MODULE_DL_FREE_FR_UPLOAD_OPTIONS=""
MODULE_DL_FREE_FR_UPLOAD_REMOTE_SUPPORT=no

AYL_SERVER='http://api.adyoulike.com/'
# Adyoulike decoding function
# Main engine: http://api-ayl.appspot.com/static/js/ayl_lib.js
#
# $1: AYL site public key
# $2 (optional): env value (default is "prod")
# stdout: On 4 lines: <word> \n <challenge> \n <token_id> \n <transaction_id>
captcha_ayl_process() {
local ENV=${2:-prod}
local URL="${AYL_SERVER}challenge?key=${1}&env=$ENV"
local TRY VARS TYPE WORDS RESPONSE TOKEN TOKEN_ID TID

TRY=0
# Arbitrary 100 limit is safer
while (( TRY++ < 100 )) || return $ERR_MAX_TRIES_REACHED; do
log_debug "Adyoulike loop $TRY"

VARS=$(curl -L "$URL") || return

if [ -z "$VARS" ]; then
return $ERR_CAPTCHA
fi

WORDS=$(echo "$VARS" | parse_json_quiet 'instructions_visual' | tr -d '\302')
TOKEN=$(echo "$VARS" | parse_json 'token') || return
TOKEN_ID=$(echo "$VARS" | parse_json 'tid') || return
TYPE=$(echo "$VARS" | parse_json "medium_type" | replace '/' '_') || return

log_debug "Adyoulike challenge: $TOKEN"

# Easy case, captcha answer is written plain text :)
# UTF-8 characters: « (\uC2AB), » (\uC2BB)
if [ -n "$WORDS" -a "$TYPE" = 'image_adyoulike' ]; then
RESPONSE=$(echo "$WORDS" | parse_quiet . '\xAB \([^ ]*\) \xBB')
[ -n "$RESPONSE" ] && break

#elif [ "$TYPE" = 'video_youtube' ];
else
log_error "$FUNCNAME: $TYPE not handled, skipping"
fi

# Maybe we'll need this later?
# curl -b "ayl_tid=$TOKEN_ID" "${AYL_SERVER}iframe?iframe_type=${TYPE}&token=${TOKEN}&env=$ENV"

FILENAME=$(create_tempfile '.ayl.jpg') || return
curl -b "ayl_tid=$TOKEN_ID" -o "$FILENAME" \
"${AYL_SERVER}resource?token=${TOKEN}&env=$ENV" || return

WORDS=$(captcha_process "$FILENAME" prompt) || return
rm -f "$FILENAME"

{ read RESPONSE; read TID; } <<<"$WORDS"

[ -n "$RESPONSE" ] && break

# Reload image
log_debug "empty, request another image"

done

echo "$RESPONSE"
echo "$TOKEN"
echo "$TOKEN_ID"
echo ${TID:-0}
}

# Output a dl.free.fr file download URL (anonymous)
# $1: cookie file
# $2: dl.free.fr url
# stdout: real file download link
dl_free_fr_download() {
eval "$(process_options dl_free_fr "$MODULE_DL_FREE_FR_DOWNLOAD_OPTIONS" "$@")"

local COOKIE_FILE=$1
local URL=$2
local PAGE FORM_HTML FORM_ACTION FORM_FILE FORM_SUBM SESSID

# Notes:
# - "curl -I" (HTTP HEAD request) is ignored (returns 404 error)
# - Range request is ignored for non Free ISP users (due to redir?)
PAGE=$(curl -L -i -r 0-1024 "$URL") || return

# Free is your ISP, this is direct download
if match '^HTTP/1.1 206' "$PAGE"; then
test "$CHECK_LINK" && return 0

FILENAME=$(echo "$PAGE" | grep_http_header_content_disposition) || return
echo "$URL"
echo "$FILENAME"
return 0
fi

local ERR1="erreur 500 - erreur interne du serveur"
local ERR2="erreur 404 - document non trouv."
if matchi "$ERR1\|$ERR2" "$PAGE"; then
return $ERR_LINK_DEAD
fi

test "$CHECK_LINK" && return 0

FORM_HTML=$(grep_form_by_order "$PAGE" 2) || return
FORM_ACTION=$(echo "$FORM_HTML" | parse_form_action) || return
FORM_FILE=$(echo "$FORM_HTML" | parse_form_input_by_name 'file' | uri_encode_strict)
FORM_SUBM=$(echo "$FORM_HTML" | parse_form_input_by_type 'submit' | uri_encode_strict)

local PUBKEY WTTI WORD TOKEN TKID ID
PUBKEY='P~zQ~O0zV0WTiAzC-iw0navWQpCLoYEP'
WTTI=$(captcha_ayl_process $PUBKEY) || return
{ read WORD; read TOKEN; read TKID; read ID; } <<<"$WTTI"

PAGE=$(curl -v -c "$COOKIE_FILE" \
-d "file=$FORM_FILE" \
-d "submit=$FORM_SUBM" \
-d "_ayl_response=$WORD" \
-d "_ayl_token_challenge=$TOKEN" \
-d '_ayl_captcha_engine=adyoulike' \
-d '_ayl_utf8_ie_fix=%E2%98%83' \
-d "_ayl_tid=$TKID" \
-d '_ayl_env=prod' \
--referer "$URL" \
"http://dl.free.fr/$FORM_ACTION") || return

# Could also check for "Code incorrect" in $PAGE
SESSID=$(parse_cookie_quiet 'getfile' < "$COOKIE_FILE")
if [ -z "$SESSID" ]; then
captcha_nack $ID
return $ERR_CAPTCHA
fi

captcha_ack $ID
log_debug "correct captcha"

echo "$URL"
}

# Upload a file to dl.free.fr
# $1: cookie file (unused here)
# $2: input file (with full path)
# $3: remote filename
# stdout: dl.free.fr download + del link
dl_free_fr_upload() {
eval "$(process_options dl_free_fr "$MODULE_DL_FREE_FR_UPLOAD_OPTIONS" "$@")"

local FILE=$2
local DESTFILE=$3
local UPLOADURL='http://dl.free.fr'
local PAGE FORM_HTML FORM_ACTION SESSIONID HEADERS STATUS MON_PL WAITTIME DL RM

log_debug "downloading upload page: $UPLOADURL"
PAGE=$(curl "$UPLOADURL") || return

FORM_HTML=$(grep_form_by_order "$PAGE" 2) || return
FORM_ACTION=$(echo "$FORM_HTML" | parse_form_action) || return
SESSIONID=$(echo "$FORM_ACTION" | cut -d? -f2)

# <input> markers are: ufile, mail1, mail2, mail3, mail4, message, password
# Returns 302. Answer headers are not returned with -i switch, I must
# use -D. This should be reported to cURL bug tracker.
HEADERS=$(create_tempfile) || return
STATUS=$(curl_with_log -D "$HEADERS" \
--referer "$UPLOADURL/index_nojs.pl" \
-F "ufile=@$FILE;filename=$DESTFILE" \
-F "mail1=" \
-F "mail2=" \
-F "mail3=" \
-F "mail4=" \
-F "message=test" \
-F "password=" \
"$UPLOADURL$FORM_ACTION") || return

MON_PL=$(cat "$HEADERS" | grep_http_header_location) || return
rm -f "$HEADERS"

log_debug "Monitoring page: $MON_PL"

WAITTIME=5
while [ $WAITTIME -lt 320 ] ; do
PAGE=$(curl "$MON_PL") || return

if match 'En attente de traitement...' "$PAGE"; then
log_debug "please wait"
((WAITTIME += 4))
elif match 'Test antivirus...' "$PAGE"; then
log_debug "antivirus test"
WAITTIME=3
elif match 'Mise en ligne du fichier...' "$PAGE"; then
log_debug "nearly online!"
WAITTIME=2
elif match 'Erreur de traitement...' "$PAGE"; then
log_error "process failed, you may try again"
break
# Fichier "foo" en ligne, procédure terminée avec succès...
elif match 'Le fichier sera accessible' "$PAGE"; then
DL=$(echo "$PAGE" | parse 'en ligne' \
"window\.open('\(http:\/\/dl.free.fr\/[^?]*\)')" | html_to_utf8)
RM=$(echo "$PAGE" | parse 'en ligne' \
"window\.open('\(http:\/\/dl.free.fr\/rm\.pl[^']*\)" | html_to_utf8)

echo "$DL"
echo "$RM"
return 0
else
log_error "unknown state, abort"
break
fi

wait $WAITTIME seconds
done
return $ERR_FATAL
}

Change log

9414a787c403 by Matthieu Crapet <mcrapet> on May 10, 2012   Diff
dl.free.fr, bayfiles: fix, drop <0xA0>
parasit characters
Go to: 
Sign in to write a code review

Older revisions

1de9fe500c71 by Matthieu Crapet <mcrapet> on May 2, 2012   Diff
dl.free.fr: fix download. Now using
"Adyoulike" advertising captcha
af89e9479527 by Matthieu Crapet <mcrapet> on Apr 25, 2012   Diff
core.sh: rework captcha engine

* captcha_process function return is
one 2 line:
captcha answer and a transaction ID.
...
9ba82984bda8 by Matthieu Crapet <mcrapet> on Apr 8, 2012   Diff
dl.free.fr: download fix for non Free
ISP users

It seems that there is some IP-ban
stuff..
...
All revisions of this file

File info

Size: 8022 bytes, 239 lines
Powered by Google Project Hosting