+2

Lập trình giúp chúng ta thoải mái hơn? (tiếp)

Trong bài trước mình đã giải quyết vấn đề khó chịu đó là chặn mấy thằng khó chịu, bây giờ thì mình muốn đem lại một cảm giác dễ chịu cho bản thân khi gặp 1 vấn đề khiến mình muốn lười.

Chắc hẳn là chúng ta khi lướt tới cùng trời cuối đất trên Internet thì kiểu gì cũng sẽ gặp 1 topic nào đó có nhiều ảnh đẹp mà muốn lưu lại để xem hoặc đơn giản là sưu tập. Yeah, mình cũng vậy, mình thích chó mèo lắm nên có hẳn 1 thư mục lưu ảnh chó mèo, có những trang nhiều thật nhiều ảnh đẹp, ví dụ như thế này, mình đi save từng cái 1 chắc chết -- vì mình lười mà =)) hoặc đơn giản thì ấn Ctrl + S thì save cả trang lại và rồi lọc lấy ảnh, nhưng mà vẫn mất công, rất thủ công và không thấy ngầu 1 tý nào, và cái chính là mình vẫn lười --

Vậy thì bỏ công sức ra 1 tý để dành cho những lần sau này được lười, làm 1 cái tool save tất cả ảnh trong 1 trang bằng cách chỉ cần nhập link vào là xong, yeah, đỉnh cao của sự lười biếng.

Chuẩn bị

  • Cài đặt Laravel
  • Cài đặt server
  • Composer update
  • Bật sublime và đọc tiếp

Thư viện

Cần 1 lib Dom Parser để còn xử lý lấy ảnh ra từ đống trang web đó, dạo 1 vòng Google tìm kiếm thì thấy có vài cái hay hay. Nhưng mà nói vậy thôi, mình hướng dẫn làm bằng cái Simple Html DOM, không phải package của Laravel, mình thấy cái tên này lâu rồi nên đoán nó được sinh ra từ rất lâu rồi. Hừm, trẻ con lại thích chơi đồ cổ.

Chết thật, giờ mở code của cái project save Image của mình ra thấy chạy ver 4.2. Thôi kệ, ai muốn làm theo thì tự chuyển sang 5.2, 5.3 mà dùng (vì mình lười nhé).

Thế nên là, các bạn down cái Simple Html DOM này về, giải nén ra lấy file simple_html_dom.php cho vào thư mục app/libraries/ (thư mục này tự tạo ra nhóe)

Mở composer.json ra thêm vào trong autoload đoạn này:

"files": [
	"app/libraries/simple_html_dom.php"
]

Rồi chạy composer dump-autoload

Cái này dễ dùng vãi, simple mà, đọc cái Quick Start của nó là ngộ ra được ngay cần phải làm gì. 😄

let's code

Vào 1 trang nào đó, chẳng hạn cái trang mình vừa bảo ở trên, Inspect Element ra thì thấy mỗi cái ảnh nó như thế này:

<em>
	<a href="http://xxx.com/forum/can-khan-giay-khi-vao-topic-nay-hot-vai-lua-x/t561390/" target="_blank">
		<img src="http://stn.depplus.vn/NewsMedia/assets/image_20160826/89630_20160826115259.jpg" class="bbcode_img">
	</a>
</em>

Một số trang khác thì nó dùng thư viện xem ảnh ví dụ như cái gì của Viblo đang dùng đây này, quên mất tên, thì link trực tiếp đến ảnh sẽ nằm ở attr href hoặc cái nào đó tính sau, còn giờ cứ tính link trực tiếp tới ảnh nằm ở src trong thẻ img đã.

Rồi, giờ tiếp theo này, dùng luôn HomeController cho nhanh này

Làm 1 cái form nhập link nhỉ:

public function index()
{
    return View::make('home.index');
}

Trong blade file home/index.blade.php

{{ Form::open(['action' => ['HomeController@store'], 'method' => 'POST']) }}
    {{ Form::text('url') }}
    {{ Form::checkbox('save') }}
    {{ Form::submit('get') }}
{{ Form::close() }}

// cái checkbox save kia là dùng để lựa chọn xem chỉ muốn save lại link hay save lại cả image, đọc tiếp sẽ hiểu

Rồi, giờ đến lúc vào vấn đề chính

public function store()
{
    $input = Input::all();

    try {
        $myFile = 'File_has_something_name.csv';
        $fh = fopen($myFile, 'w') or die('can\'t open file');
        $html = file_get_html($input['url']);

        foreach($html->find('img') as $element) {
            $imgUrl = $element->src;

            if (self::isNeededImg($imgUrl)) {
                if (isset($input['save'])) {
                    self::saveImg($imgUrl);
                }

                fwrite($fh, $imgUrl . "\n");
            }
        }
    } catch (Exception $e) {
        return;
    }

    fclose($fh);
}

Phía trên là function store(), mặc định thì sẽ sinh ra cho chúng ta 1 file csv chứa đường link ảnh, nếu chúng ta chọn checkbox save vừa nói ở trên thì sẽ save lại ảnh. Có 2 function ở dây mà các bạn nhìn thấy, đấy là isNeededImg($imgUrl)saveImg($imgUrl).

Bởi là vì thành phần tag img trong 1 trang web không chỉ có mấy bức ảnh mà chúng ta cần, mà còn có hàng đống image khác của trang web đó nữa, ví dụ header, footer, avatar thàng post bài, vân vân và vân vân... do đó cần có hàm kia để lọc mấy cái ảnh không cần thiết. =)) lọc thế nào thì các bạn thử nghĩ xem, mình gợi ý là src của mấy cái ảnh không cần đó thường chứa link domain của trang web chúng ta kéo ảnh về, vì mấy cái ảnh không cần đó thường nằm trong thư mục public của project mà, ví dụ trang ví dụ của chúng ta có ảnh avatar thằng up ảnh như thế này

http://xxx.com/uploads/member/avt_thumb/sa/sao/sao.png

còn ảnh đẹp của mình thì thường đặt ở server ảnh, tất nhiên rồi, làm méo có trang xem ảnh nào lại chứa ảnh ở ngay host của nó đâu (đoạn này giải thích hơi khó hiểu vì mình không biết giải thích thế nào) ví dụ thế này

http://stn.depplus.vn/NewsMedia/assets/image_20160826/89630_20160826115259.jpg

vậy là dễ rồi, isNeededImg($imgUrl) trả về false nếu $imgUrl chứa domain nằm trong $input['url'], vì nó là ảnh trang trí các kiểu của trang web thôi.

Còn hàm saveImg($imgUrl) thì nó như thế này

    public static function saveImg($imgUrl)
    {
            $imageName =  basename($imgUrl);
            $urlFolder = '/var/www/html/xxxProject/public/images/';
            //windows thì đặt ntn 'E:\xxxProject\public\images'; hoặc để chỗ quái nào mà bạn thích
            file_put_contents($urlFolder . $imageName, file_get_contents($imgUrl));
    }

Hị, xong roài đấy, giờ thì sự lười của chúng ta đã được update thêm 1 level nữa 😗 giờ thì cứ trời đất rồi copy link, paste, save, và thưởng thức. 😗

save ảnh theo kiểu nguy hiểm hơn

Chắc các bạn đều biết đến những trang blog ảnh như Filckr của Yahoo hay Tumblr của Yahoo nốt... lắm vậy @@

Yeah, 1 kho ảnh đẹp và theo đúng chủ đề luôn nhé.

Buồn ngủ quá, giới thiệu về Tumblr thôi nhé. Ý tưởng trong đầu mình ngay từ đầu là đã muốn kéo hết sạch ảnh của 1 tay blog nào đó về luôn rồi. Yeah, chắc hẳn là mọi người sẽ nghĩ tới API của Tumblr đúng hem? =)) mình thì lười mà, nên mình sẽ lên Google và tìm kiếm với cụm từ khóa "Tumblr view all image" =)))))

Hị hị, được vài trang, ví dụ tumblrview.com, tumbview.com, tumbex.com,... nhưng mà hãy dùng tumblrview.com đi. Vì sao à? vì mấy trang còn lại có cách tổ chức trang rất lằng nhằng và paginate bằng ajax, mình méo thích 1 tý nào luôn. :-\ Còn tumblrview.com thì thật tuyệt cmn vời nhé, paginate bằng link bình thường, dùng method GET để load dữ liệu 😗

Và khi mà định lôi cả họ hàng nhà người ta về như thế thì sẽ rất mất nhiều thời gian, nên chuyển qua dùng Commands của Laravel.

Command file

Chạy lệnh php artisan make:console GetImages nếu ở 5.2 còn ở 4.2 thì gõ php artisan command:make GetImages

Ta được File GetImage trong thư mục commands.

Sửa

protected $name = 'get:images';

đây là lệnh để gọi cái command này.

Rảnh thì sửa

protected $description = 'Get something :#).';

Rồi sửa arguments:

    protected function getArguments()
    {
        return [
            ['user', InputArgument::REQUIRED, 'Tumblr user'],
            ['page', InputArgument::REQUIRED, 'Tumblr View page'],
            ['save', InputArgument::REQUIRED, 'Save file'],
        ];
    }

giải thích:

user là tên của blog tumblr page là số trang ảnh mà ông tumblrview.com mang lại save giống như ở trên, là có muốn save ảnh hay chỉ lấy link thoai

Rồi, dài dòng vãi, để mình viết luôn hàm fire cho các bạn ngự lãm:

    public function fire()
    {
        $save = $this->argument('save');
        $user = $this->argument('user');
        $lastPage = $this->argument('page');
        $limit = 50;
        $myFile = 'Tumblr_' . $user . '.csv';
        $fh = fopen($myFile, 'w') or die('can\'t open file');
        $url = 'http://tumblrview.com/index.php?';

        for ($page = 1; $page <= $lastPage; $page++) {
            try {
                $fullUrl = $url . 'user=' . $user . '&offset=' . (($page - 1) * 50) . '&limit=' . $limit . '&page=' . $page;
                $html = file_get_html($fullUrl);

                foreach($html->find('a') as $element) {
                    $imgUrl = $element->href;

                    if (self::isNeededImg($imgUrl)) {
                        if ($save == 1) {
                            self::saveImg($imgUrl)
                        }

                        fwrite($fh, $imgUrl . "\n");
                    }
                }
            } catch (Exception $e) {}
        }

        fclose($fh);
    }

Bởi vì ông tumblrview này dùng trình xem ảnh là fancybox nên url trực tiếp tới ảnh nằm trong href của thẻ a nên ta dùng $html->find('a').

Ví dụ mình có blog của ông dogsandcatslivingtogether, mình làm thế này:

12.JPG

25 là tổng số page của ông này, 0 là mình không muốn save ảnh, chỉ lấy link, còn mấy cái % kia là mình viết thêm vào để biết đc là đã chạy bao nhiêu % đóa.

Các bạn vào trang tumblrview thì sẽ thấy ngay tại sao mình lại tạo $url như thế kia nhé.

Sau khi chạy xong thì ta có 1 file csv tên là Tumblr_dogsandcatslivingtogether.csv nhé, để cho đẹp nếu các bạn chọn save = 1 ở trên rồi, còn nếu không thì dùng IDM mà import đống link này mà down

Kết luận

  • Cái chính là dùng đúng từ khóa để mà tìm được blog tumblr nào hay, vì ngoài chó mèo ra thì cái mục đích cơ bản để tumblr tồn tại là 😉) hị hị
  • Dùng khả năng của mình để làm cho bản thân thoải mái (kiểu như là "tự sướng" vậy) thì thấy rất sướng đúng không? 😄

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí