2020년 2월 13일 목요일

윈도우 10 IPsec VPN Server 연결하기

윈도우 10 IPsec VPN Server 연결하기
먼저
윈도우 화면 하단 우측에 트레이 아이콘의
인터넷 연결 안테나에서 마우스 우측 클릭
네트워크 및 인터넷 설정 열기 클릭
왼쪽 VPN 메뉴 클릭 후 +VPN 연결 추가 클릭
VPN 공급자란 클릭 후 Windows(기본 제공) 클릭
연결 이름란에 원하는 이름 입력 (예: 나의VPN)
서버 이름 또는 주소란에 vpn server 아이피 입력
VPN 종류란에 L2TP/IPsec 및 미리 공유한 키 선택
미리 공유한 키란에 vpn server 설치시 설정한 키값 등록
저희 경우는: cloud_virtual_machine
로그인 정보 입력 란에 사용자 이름 및 암호 선택
사용자 이름 (옵션) 란에 vpn server 설치시 등록한 아이디 입력
암호(옵션)란에 vpn server 설치시 등록한 비밀번호 입력
저장 버튼 클릭
그러면 VPN 메뉴창에 금방 추가한 나의VPN이 보여지고
그걸 클릭해서 연결을 누르면 vpn 연결이 됩니다.
설정 창 닫고 사용 하시면 됩니다.
추후에 다시 연결 및 끊기를 하실려면
윈도우 화면 우측 하단에 네트워크 연결 안테나
마우스 우 클릭 후 나의VPN 을 찾아서 클릭하면
연결 끊기 및 연결하기 버튼이 있습니다.
그걸로 사용 하면 됨

연결시도 했을때
보안 계층에서 원격 컴퓨터와 초기 협상 동안 처리 오류를 발견했기 때문에
L2TP 연결 시도에 실패했습니다. 라는 에러가 뜨서
레지스터 등록 후 문제 해결 했습니다.

레지스트리 추가 방법
윈도우 좌측 하단 검색란에 cmd 입력 후 명령 프롬프트 앱 메뉴에서
우클릭 후 관리자 권한으로 실행 클릭
디바이스 허용 경고창이 나오면 예 클릭

아래 코드를 복사해서 명령 프롬프트창에 붙여 넣고 엔터
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

아래 코드도 명령 프롬프트 창에 붙여 넣고 엔터
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters /v ProhibitIpSec /t REG_DWORD /d 0x0 /f

위처럼 하고 연결 하니 연결 잘 되네요..

2020년 2월 12일 수요일

Ubuntu 18.04 IPsec VPN Server Auto Setup Scripts

참고: https://github.com/hwdsl2/setup-ipsec-vpn#quick-start

먼저 시스템을 업데이트하고 재부팅하십시오.
이것은 선택 사항이지만 권장됩니다.
# sudo apt update && sudo apt dist-upgrade
# sudo reboot

VPN 자격 증명을 환경 변수로 정의
모든 값은 반드시 작은 따옴표 안에 넣어야 합니다.
보안 IPsec PSK(VPN_IPSEC_PSK)는 최소 20 개의 임의 문자로 구성되어야합니다.

# wget https://git.io/vpnsetup -O vpnsetup.sh && sudo \
   VPN_IPSEC_PSK='cloud_virtual_machine' \
   VPN_USER='administrator' \
   VPN_PASSWORD='mypasswd@1234' \
   sh vpnsetup.sh

IPsec VPN(L2TP) 는 500, 4500 UDP 포트를 사용합니다.
# sudo ufw allow 500/udp
# sudo ufw allow 4500/udp
# sudo ufw allow 22/tcp // ssh 접속을 위해
# sudo ufw allow 80/tcp // 추후 웹 서버를 위해
# sudo ufw allow 443/tcp // 추후 웹 서버를 위해
# sudo ufw enable  // 비활성화 상태를 활성화
# sudo ufw disable  // 비 활성화
# sudo ufw status // 방화벽 상태 보기
# sudo ufw status verbose // 방화벽 상태 자세히 보기

// 참고: https://blog.naver.com/linuxni/221278157418
만약 키 값을 변경 할려고 하면 /etc/ipsec.secrets 파일 수정
%any %any : PSK "원하는 키값"

유저 등록은 /etc/ppp/chap-secrets 에 추가 하면 됨
"아이디" l2tp "비밀번호" *
* 부분은 모든 아이피 접속 가능허용
유저 등록시 ipsec와 xl2tpd 재시작 안해도 됨

vpn server 시작, 정지, 제시작( start, stop, restart)
# sudo service ipsec restart
# sudo service xl2tpd restart

윈도우10에서 vpn 접속 하는 방법은 다음 포스터에서...

2020년 2월 7일 금요일

우분투 프록시 서버 설치 하기 Shadowsocks-libev

우분투 18.04 에 프록시 서버 설치

Shadowsocks는 인터넷 검열을 우회하는 가볍고 빠르고 안전한 
Socks5 프록시입니다.

프로그램 설치
    sudo apt update
    sudo apt install shadowsocks-libev

설정 파일을 열어서 수정
    sudo vi /etc/shadowsocks-libev/config.json

파일이 열리면 아래와 같은 내용이 있습니다.
적절히 수정 하시면 됩니다.
{
"server":"123.123.123.123",
"server_port":8388,
"local_port":1080,
"password":"mypasswd@1234",
"timeout":60,
"method":"chacha20-ietf-poly1305"
}
server 는 사용 하시는 서버의 아이피 이고
password 는 접속시 사용아리 비밀번호 입니다.
포트는 8388 그대로 사용 해도 되지만 
저는 8888 로 변경했습니다.
저장 후 닫고 빠져 나오시면 됩니다.

Shadowsocks-libev 서비스 시작
    sudo systemctl start shadowsocks-libev.service

리눅스 서버 재부팅시 자동 시작을 활성화 
    sudo systemctl enable shadowsocks-libev.service

Shadowsocks-libev 상태확인
    systemctl status shadowsocks-libev.service

Shadowsocks-libev 설정 파일을 다시 적용 할려면
    sudo systemctl restart shadowsocks-libev

위에서 적용한 서버 포트의 방화벽을 열어 줘야 합니다.
UFW 방화벽을 사용하는 경우 다음 명령을 실행
    sudo ufw allow 8888

iptables 방화벽을 사용하고 있다면 아래 명령어로 방화벽 열기
sudo iptables -I INPUT -p tcp --dport 8888 -j ACCEPT sudo iptables -I INPUT -p udp --dport 8888 -j ACCEPT

AWS 또는 Google Cloud를 사용하는 경우 웹 기반 제어판에서 방화벽을 구성해야합니다.

----------------  모바일에서 접속 방법 ---------------------
모바일에서 접속 할려면 앱 스토어에서 Shadowsocks 검색 후 설치하고
위에서 설정한 내용을 모바일에 그대로 작성하면 접속 됩니다.



위 참고 사이트를 보면 Ubuntu 데스크탑에서 설치법과
브라우저에서 접속 방법이 나와 있습니다.







2017년 9월 14일 목요일

nginx 가상 호스트 설정하기

이전 포스트에서 nginx, php7-fpm, mariadb 설치 하는 과정을
적어 보았다
이제 가상 호스트 설정 하는 방법을 알아 보자
가상 호스트는 한 서버에서
여러 도메인을 사용 할 수 있는 기능을 말한다.
예를 들어 그누보드, 워드프레스, xe, 마젠토등을 설치하고
각각의 사이트에 도메인을 부여해서 운영 할 수 있는 방법이다.

이전 포스트를 보았다면 # 표시는 명령어가 아니고
터미널 표시인것을 알았을 것이다
그러므로 아래 내용에서 # 이 있는 줄의 내용은
그대로 복사해서(#은빼고) 터미널에 붙여 넣고 엔터를 치면 된다.

# sudo -i
위 명령어로 root 권한을 얻는다. 당연히 root 비밀번호를 입력해야 한다.

워드 프레스 가상 호스트를 만들어 보자
# adduser wordpress
위 명령어로 비밀번호를 입력하고 이름 같은건 대충 알아서 입력하면 된다.

# mkdir /home/wordpress/www
# mkdir /home/wordpress/log
# chown www-data.www-data /home/wordpress/
# chown www-data.www-data /home/wordpress/*

위 명령어로 웹의 최상위 디렉토리 www 를 만들고
접속 로그 기록을 위한 log 디렉토리를 만들고
wordpress 디렉토리에 www-data 권한을 주었다
php-fpm 은 www-data 권한으로 실행한다.


자 이제 php-fpm pool 파일을 작성해야 한다.
뭔 내용인지 모르면 그냥 따라 하면 된다.
# vi /etc/php/7.0/fpm/pool.d/wordpress.conf
위 명령어로 파일을 하나 만들고
그 내용을 아래와 같이 입력한다.

[wordpress]

user = wordpress
group = wordpress

listen = /run/php/wordpress.sock

listen.owner = wordpress
listen.group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/wordpress.log
;php_admin_flag[log_errors] = on

;php_admin_value[memory_limit] = 128M
;php_admin_value[max_execution_time] = 120
;php_admin_value[max_input_time] = 300

;php_admin_value[post_max_size] = 25M
;php_admin_value[upload_max_filesize] = 25M

위와 같이 입력 후 저장하고
Nginx 서버 구문을 작성해야 한다

# vi /etc/nginx/conf.d/wordpress.conf
위 명령어를 실행 후
파일 내용을 아래와 같이 입력

server {
    listen       80;
    server_name  mydomain.com *.mydomain.com;
    root   /home/wordpress/www;

    access_log /home/wordpress/log/access.log;
    error_log  /home/wordpress/log/error.log warn;

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }

    # Block dot file (.htaccess .htpasswd .svn .git .env and so on.)
    location ~ /\. {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Block .php file inside upload folder. uploads(wp), files(drupal, xe), data(gnuboard).
    location ~* /(?:uploads|files|data)/.*\.php$ {
        deny all;
    }

    # Add PHP handler
    location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/wordpress.sock;
    }
}

위처럼 저장하면 된다.
만약 이미지, css 파일같은 static 컨텐츠를 브라우저 캐쉬 설정할려면
server 블럭 안에  아래 코드를 추가 하면 된다.

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}

위 코드중 expires 의 설정이 캐쉬 기간 설정이다
1y는 1년, 1M은 한달, 1d는 10일, 1h는 한시간

자 위처림 했다면 이제 php와 nginx 를 재시작 해 준다.
# service php7.0-fpm restart
# service nginx restart

여기 까지 왔으면 도메인을 구매 하고 그 도메인을 서버로 연결 하면 된다.

자 다음 포스트에는 우분투에 ftp 설치 하고 접속하는 법을 알아 보자

우분투 nginx, php7.0-fpm, mariadb 설치 - ubuntu 16.04

이 글은 우분투 16.04버전에서 
엔진x, php7-fpm, mariadb 설치한것을 기록한다.

본인은 리눅스 서버 접속시 putty를 사용해서 접속한다
putty 다운로드는 구글에서 검색하면 많이 나오기 때문에 생략

우분투는 기본적으로 root 계정을 사용하지 못한다
root 계정이 필요한 경우 sudo 명령으로 root 권한의 명령어를 실행할 수 있다.

아래는 내가 설치한 내용을 그대로 옮겨 적었다.
# 표시는 명령어가 아니고 터미널에 입력한 명령이란 뜻이다.
그러므로 아래 내용에서 # 이 있는 줄의 내용은
그대로 복사해서(#은빼고) 터미널에 붙여 넣고 엔터를 치면 된다.

# sudo -i   
위 명령어로 root 권한을 얻는다 비밀번호를 입력하고 나면 root 권한 획득


# uname -a   
# cat /etc/issue  
# df -h
# free -m
# cat /proc/cpuinfo | grep processor | wc -l  
위 명령어는 순서대로 설명하자면
리눅스 버전 체크,
Ubuntu 버전체크,
하드용량체크,
메모리 체크,
cpu 코어수 체크
nginx, php, mysql(mariadb) 시스템을 설치 하는 과정에서 
위 명령어를 사용 할 필요는 없지만
한번쯤 확인해 보는것도 나쁘지 않을것 같기에 기록함

이제 본격적으로 셋팅
# apt-get update && apt-get upgrade
# dpkg-reconfigure tzdata
# sudo apt-get install gcc g++
위 명령어 설명은
패키지 목록 갱신 &&  운영체제에 설치되어있는 프로그램 최신버전 패치
시스템 시간 설정(건너뛰어도 됨)
gcc 컴파일러 설치 


# apt-get install sendmail
위 명령어는 php 코드로 메일발송시 서버가 메일을 발송할 수 있게 sendmail을 설치한다
그누보드 같은경우 메일인증이 있기 때문에 위 명령어는 필수
사실 거의 모든 사이트에서 메일인증및 메일 보내기를 사용하기 때문에
무조건 설치 해야 할듯...
위 명령어 실행시 경고 문구가 뜨는데 상관없음
Warning: 3 database(s) sources
were not found, (but were created)
please investigate.

#vi /etc/mail/local-host-names
위 명령어로 vi 편집기를 열어서 
localhost 만 남기고 다 지운후 저장하고 빠져 나온다


아래는 방화벽 설정 
# ufw status 
# ufw status verbose 
# ufw allow 22/tcp
# ufw allow 80/tcp
# ufw allow 443/tcp
# ufw enable
방화벽 상태,  방화벽 상태 자세히 보기, 
22번 tcp 포트 사용,
80번 tcp 포트 사용,
443번 tcp 포트 사용,
방화벽 활성화



이제 Nginx 설치하자
# apt-get install nginx -y

설치가 끝나면 vi 로 파일을 열어서 php 파일을 인식할수 있도록 설정을 해야한다
# vi /etc/nginx/sites-available/default
파일이 열리면 아래와 같은 줄을 찾아서
index index.html index.htm index.nginx-debian.html;
index.php 를 추가 해 준다.
결과 
index.php index index.html index.htm index.nginx-debian.html;


그리고 fastcgi_params 설정파일도 아래와 같이 수정

# vi /etc/nginx/fastcgi_params
fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;
fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;
fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;
fastcgi_param   HTTPS                   $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

이렇게 하면 Nginx 설치는 끝
이제 php 설치 하면 된다.

# apt-cache search php-mysql
# apt-cache search php7
ubuntu에서 소프트웨어, 라이브러리를 검색하는 명령어는 apt-cache 이다.
search 를 통해서 패키지검색을 할 수 있다.
apt-cache --help 명령어를 쳐 보면 더 많은 정보를 확인 할 수 있다.

# apt-get install php7.0-fpm php7.0-mysql php7.0-zip php7.0-json php7.0-xml  php7.0-mcrypt php7.0-curl php7.0-gd libapache2-mod-php7.0 php7.0-mbstring php7.0-soap
위 명령어로 php와 관련 라이브러리를 설치 한다.
설치가 끝나고 나면
# cd /var/www/html/
명령어로 해당 디렉토리로 이동후 
# vi index.php 
명령어로 파일을 만들고 
파일안에 아래 코드를 넣는다
<?php
phpinfo();
?>

이제 본인 웹 브라우저로 본인의 우분투 서버 아이피를 접속해 보면
php 환경 설정 내용을 확인 할 수 있다.

자 이제 php 설치를 마무리 했으니
환경 설정을 해보자.

# vi /etc/php/7.0/fpm/php.ini
위 파일을 열어서 아래 코드들을 찾아 수정해 준다
    cgi.fix_pathinfo = 0 // 비정상적으로 접근 차단
    allow_url_fopen = Off // 웹경로 방식으로 include 안됨
    expose_php = Off        // HTTP 헤더에 PHP 버전이 노출된다.
    display_errors = Off
    date.timezone = Asia/Seoul

    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=128
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60

vi 편집기 안에서 문자열을 검색할 때는 /문자열 엔터
하면 문자열을 찾아 준다 같은 문자열이 여러개 일때는 n 키를 누르면
다음 검색으로 이동 한다.
위 파일을 수정하고 저장 했다면 아래 파일도 위와 같게 수정 해야 한다.
# vi /etc/php/7.0/cli/php.ini

수정을 다 했으면 php 대몬을 재시작
# service php7.0-fpm restart


자 이제 mariadb 설치를 하자
mysql 를 설치 해도 상관 없지만 mariadb 가 성능이 좋고
mysql 과 명령어 내용이 동일 하다고 해서 본인은 mariadb를 설치 했다.
참고로 그누보드도 mariadb 를 지원한다.
mariadb 설치 설치 위치는 /var/lib/mysql/ (그냥 참고 )

# apt-get install mariadb-server mariadb-client
위 명령어로 디비 설치
그리고 기본 환경 셋팅을 해야 한다 비밀번호 등
아래 명령으로 실행하면 된다.
# sudo /usr/bin/mysql_secure_installation
위 명령을 치면 DB 비밀번호를 입력하라고 하는데
금방 설치했기에 비밀번호가 없다 그래서 그냥 엔터를 치면 된다.
그리고 새로운 비밀번호 셋팅을 한건지 묻는데 Y를 입력후 비밀번호를 
설정한다
그리고 나머지 묻는거에는 대충 알아서 하면 된다.
test 디비 삭제 할건지, test유저 삭제 할건지, DB를 원격으로 root 접속 허용 할건지 등등
본인은 DB를 원격으로접속 할 일이 없기에 N,
test 디비와 test 계정 삭제는 Y 로 셋팅했다.

만약 mariadb 를 삭제 할때에는 아래처럼 하면 된다.
    sudo /etc/init.d/mysql stop
    sudo apt-get remove --purge mysql-server mysql-client
    sudo netstat -tap | grep mysql
    sudo apt-get remove --purge mysql-server*
    sudo apt-get remove --purge mysql-client*
근데 굳이 삭제할 일이 잘 없음 그냥 알아 놓자는 의미로 적었다.

db설정 파일을 조금 수정 해 주자
# vi /etc/mysql/my.cnf
vi 로 파일을 열어서 제일 마지막 줄에
아래 코드 추가
[mysqld] 
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci


그리고 디비 재시작
# service mysql restart 

자 이제 디비를 접속해서 새로운 데이트 베이스, 계정을 만들어 보자
# mysql -u root -p
위 명령어를 치면 DB root 비밀번호를 입력하라고 한다.
위에서 설정하면서 입력한 비밀번호를 입력후 db 에 접속한다.
접속을 성공하면 아래 명령어를 입력해서 새로운 계정과 디비를 만들어 준다
> 는 빼고 입력해야 한다.
>CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
>create user 'wordpress'@'localhost' identified by 'wordpress@1234';  
>grant all privileges on wordpress.* to wordpress@'localhost'; 
>exit;

자 이제 워드프레스 디비와 워드프레스 디비 계정을 만들고 
mariadb를 빠져 나왔다.
wordpress를 설치 하기 위해 위 명령어를 미리 입력 해 놓았다.

자 이제 워드프레스 설치 준비가 되었으니 
워드 프레서 설치를 해 보자
# cd /var/www/html
# wget https://wordpress.org/latest.tar.gz 
# tar xvzf latest.tar.gz
# chown www-data.www-data -R wordpress/
# chown www-data.www-data -R wordpress/*

위 명령어는 
웹서버 홈 디렉토리 이동,
워드 프레스 설치파일 다운로드,
압축 풀기,
wordpress 폴더 권한 설정  이다.
(php-fpm 은 www-data 권한으로 실행)

이제 브라우저로 http://서버아이피/wordpres 주소로 접속해 보자

워드 프레스를 다 설치 했으면 웹으로 디비관리를 쉽게 하기 위해
phpmyadmin 을 다운 받아 보자

# cd /var/www/html
# wget https://files.phpmyadmin.net/phpMyAdmin/4.5.2/phpMyAdmin-4.5.2-all-languages.zip
# apt-get install unzip
# unzip phpMyAdmin-4.5.2-all-languages.zip
# mv phpMyAdmin-4.5.2-all-languages.zip phpmyadmin

위 명령어 apt-get install unzip 는 zip 압축관련 프로그램 설치명령이고
unzip phpMyAdmin-4.5.2-all-languages.zip 는 압축해제 명령이고
mv phpMyAdmin-4.5.2-all-languages.zip phpmyadmin 는 파일명 변경 명령이다.

이제 브라우저로 http://서버아이피/phpmyadmin 주소로 접속해 보자
아미 아이디 비밀번호를 입력 하라는 창이 뜰 것이다.
이때 아까 위에서 워드프레스 db를 만들때
아이디 비밀번호도 만들었는데 그걸로 로그인 하면 된다.
본인은 아이디 wordpress 비밀번호 wordpress@1234 로 로그인 했다
아마 워드프레스를 설치 했다면 해당 테이블들이 설치 되어 있을 것이다.

다음은 가상호스트 설정 하는 방법도 쓸려고 했는데
글이 길어져서 다음 글에 기록 함

2017년 8월 1일 화요일

c# HttpWebRequest 쿠키 복사

private void btnBrowserConn_Click(object sender, EventArgs e)
{
            HttpWebRequest wReq;
            HttpWebResponse wRes;
            string url = "test.com";

           // 로그인 된 쿠키 정보를 가져와서 사용하기
            CookieContainer container = GetCookieContainer(url);
         
            wReq = (HttpWebRequest)WebRequest.Create("http://" + url );
            wReq.Method = "GET"; // "GET" or "POST"
            wReq.ServicePoint.Expect100Continue = false;
            wReq.CookieContainer = container;

            using (wRes = (HttpWebResponse)wReq.GetResponse())
            {
                Stream respPostStream = wRes.GetResponseStream();
                StreamReader readerPost = new StreamReader(respPostStream);

                string resResult = readerPost.ReadToEnd();
            }
}

public CookieContainer GetCookieContainer(string url)
{
            CookieContainer container = new CookieContainer();

            foreach (string cookie in webBrowser1.Document.Cookie.Split(';'))
            {
                string name = cookie.Split('=')[0];
                string value = cookie.Substring(name.Length + 1);
                string path = "/";
                string domain = "." + url;
                container.Add(new Cookie(name.Trim(), value.Trim(), path, domain));
            }

            return container;
}

// 셀레리움  쿠키 복사
var cookieManager = chromeBrowser.GetCookieManager();
cookieManager.VisitAllCookies(new CookieVisitor());

// 셀레리움  쿠키 복사
--------------------------------------------------------------------------
CookieContainer cookieContainer = new CookieContainer(); CookieCollection cc = new CookieCollection(); foreach (OpenQA.Selenium.Cookie cook in _driver.Manage().Cookies.AllCookies) { System.Net.Cookie cookie = new System.Net.Cookie(); cookie.Name = cook.Name; cookie.Value = cook.Value; cookie.Domain = cook.Domain; cc.Add(cookie); } cookieContainer.Add(cc); HttpWebRequest httpWebRequest; httpWebRequest.CookieContainer = cookieContainer;

2017년 4월 17일 월요일

c# 으로 웹 HTML 스크롤링[파싱] 할때 사용하는 라이브러리

웹 스크롤링을 파싱이라고 많이들 부른다.
정확한 단어는 스크롤링이라고 알고 있지만
보통 파싱이라는 단어를 많이 쓰고있다.
뭐 어째든 c# 으로 html 파싱을 할때 참 좋은 라이브러리가 있어
나중에도 사용하기 위해 포스트를 남겨 본다.

html 파일을 읽어 와서 파싱하는 방법은 아주 많이 있다.
그 중 내가 좀 할 줄 아는것은 php, 파이썬, c# 인데
파이썬도 편하지만 개발 툴 때문에 나는 c#을 주로 사용한다.

c# 으로 웹 html 파일을 읽어 올때
윈폼의 Webbroswer 컨트롤을 올려서 스크롤링 하는 방법이 있는데
이경우는 무조건 느리다.
나도 webbroswer 컨트롤로 스크롤링을 많이 하였지만
자바스크립트 에러 대처, 속도 이런 부가적인 문제 때문에
지금은 무조건 HttpWebRequest 를 사용해서 스크롤링 한다.

사설이 길었는데
HttpWebRequest 로 html 파일을 읽어와서 파싱할때 사용하는
아주 유용한 라이브러리중에 HtmlAgilityPack 라는것이 있다
NuGet 패키지 관리에서 HtmlAgilityPack 를 검색하고 설치하면 된다.
HtmlAgilityPack 라이브러리는 xPath 문법을 제공하는데
이 문법을 간략히 설명하자면 아래와 같다.

HtmlDocument doc = new HtmlDocument(); // 객체생성
doc.LoadHtml("html 문서내용");          // 돔 초기화

HtmlNode singleNode = doc.GetElementbyId("tagId"); // 태그의 ID=tagId 인것
//singleNode 노드의 자식중 a 태그들 *(.) 이 있어야 현재 노드부터 찾는다
HtmlNodeCollection anchors = singleNode.SelectNodes(".//a");
//singleNode 노드의 프로퍼티(클래스)값을 리턴한다.
string className = singleNode.GetAttributeValue("class", "");


// 메타태그중 name=keywords 인것
HtmlNodeCollection keyword = doc.DocumentNode.SelectNodes("//meta[@name='keywords']");

// div태그중 class=articles 인것
HtmlNodeCollection article = doc.DocumentNode.SelectNodes("//div[@class='articles']");

// 이렇게 경로로 특정 태그를 찾을수도 있음
HtmlNodeCollection anchors = doc.DocumentNode.SelectNodes("//table/tbody/tr/td/a");

// 특정 요소에서 자식요소들 Index 로 접근시
singleNode.SelectSingleNode(".//tbody/tr/td[1]").InnerText

위 문법만 사용하면 왼만한 태그는 다 찾아 올 수 있다.
중요한것은 특정 싱글 노드를 찾아서 그 자식요소들을 모두 리턴 받을때는
쩜(.)을 찍고 하위 노드를 입력해야 한다는 것이다.
좀더 자세히 알고 싶으면 xPath 문법을 검색 해 보면 알 수 있을것이다.

뭐 특정 웹 사이트를 읽어 와서 스크롤링(파싱)하는 코드를
추가 하고 싶지만 맨날 하는일이라 패스~~