본문 바로가기
C++ 200제/코딩 IT 정보

C# HttpWebRequest, HttpWebResponse 삭제된 블로그 URL 찾기

by vicddory 2019. 2. 28.

C#으로 티스토리에 지워진 포스팅 주소 (웹페이지) 찾기 


「삭제된 포스트 찾기」란 티스토리 전용 프로그램 소개합니다.

네이버, 구글 웹마스터 관리하다 보면 삭제된 포스트 주소 URL 때문에 헷갈리는 경우가 가끔 발생하는데요. 예를 들어 주소 1에서 100 사이에 지워진 포스트 주소(웹페이지)가 무엇인지 모를 때 사용할 프로그램입니다.


코딩 가능한 분은 아래 두 클래스 참조하세요.

  • HttpWebRequest
  • HttpWebResponse


C#으로 티스토리에 지워진 포스팅 주소 (웹페이지) 찾기[C# http 통신으로 URL 호출]


내 블로그에서 비공개 또는 삭제한 포스트 주소를 알아야 할 경우가 있습니다. 가끔 저품질이나 포스트 검색 누락이 발생하면 일부러 삭제하거나 비공개로 전환하기 때문이죠. 일일이 기록하긴 힘들고, 기록해도 잊어버릴 때가 있어요. 공들여 쓴 포스트를 비공개로 전환했는데 까먹고 계속 비공개로 놔두면 참 속상하죠. 


물론, 매일 사용할만한 프로그램은 아니지만, 일이 있을 땐 유용하게 사용할 수 있습니다. 저 역시 검색 누락 등이 발생하면 이 프로그램으로 삭제되었거나 비공개로 전환된 포스트 확인합니다. 그리고 웹마스터에 삭제 요청이나 추가 검색 등록을 요청하죠.



웹페이지 유효성 검사 - 프로그램 사용 방법


  1. 티스토리 전용 프로그램
  2. 주소 설정 : 포스트 주소를 "숫자"로 설정합니다.


C# HttpWebRequest, HttpWebResponse 삭제된 블로그 URL 찾기[C# http 통신으로 URL 호출]


위 두 가지 사항이 충족되어야 프로그램이 정상 실행됩니다. 그리고 아래는 실제 구동된 프로그램 캡처 화면입니다.


C# HttpWebRequest, HttpWebResponse 블로그 삭제된 URL 찾기[C# http 통신으로 URL 호출]


  1. 블로그 주소 입력 : 검색을 원하는 티스토리 블로그 주소
  2. 검사 범위 설정 : 검색할 포스트 URL 끝 번호


예시) http://codingcoding.tistory.com/100


- 웹페이지 주소 맨 뒤에 100을 의미함.



C# WEB 프로그램 소스 코드


RemovedCheck.zip


삭제된 URL 찾는 프로그램 소스 코드는 위에 있고, 전체 라인은 201줄로 짧은 편입니다.


1. 검사 버튼 클릭 이벤트


텍스트 박스에 입력된 값을 검사하는 유효성 소스가 대부분입니다.


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
private void btn_ckeckup_Click(object sender, EventArgs e)
{
    if (tb_idx_start.Text.Length < 1 || tb_idx_start.Text.Length < 1)
    {
        MessageBox.Show("시작 주소와 마지막 주소 입력하세요");
 
        return;
    }
 
    if (Convert.ToInt32(tb_idx_start.Text.ToString()) 
        >= Convert.ToInt32(tb_idx_end.Text.ToString()))
    {
        MessageBox.Show("시작, 마지막 주소 다시 확인하세요");
 
        return;
    }
 
    lbox_removed_url.Items.Clear();
    lbox_used_url.Items.Clear();
 
    try
    {
        // 1. 문자열 분리1. [0] = "http://아이디", [1] = "tistory", [2] = ".com"
        // 2. 문자열 분리2. [0] = "http:" [1] = "", [2] = "아이디"
        string[] address_check = tb_blog_url.Text.ToString().Split('.');
        string[] head_check = address_check[0].Split('/');
 
        if (head_check[0].CompareTo(ADDR_HEAD) != 0)
        {
            MessageBox.Show("주소 앞에 http:// 넣어주세요");
        }
        else if (head_check[1].CompareTo(""!= 0 || head_check[2].CompareTo(""== 0)
        {
            MessageBox.Show("주소 형식을 맞춰 주세요");
        }
        else
        {
            if (address_check[2].CompareTo("com"== 0)
            {
                address_check[2= "com/";
                tb_blog_url.AppendText("/");
            }
 
            if (address_check[1].CompareTo(ADDR_TISTORY) != 0 
                || address_check[2].CompareTo(ADDR_COM) != 0)
            {
                MessageBox.Show("tistory.com만 지원합니다");
            }
            else
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"알 수 없는 에러(btn_ckeckup_Click) :  {ex.ToString()}");
    }
}
cs


입력값이 모두 정상이면 51번 라인에서 백그라운드워커가 구동합니다. BackgroundWorker는 GUI 도구상자에서 추가했습니다.


2. 리스트박스 클릭 이벤트


유효한 URL과 삭제된 URL을 추가하는 ListBox는 다릅니다. 리스트 박스에 추가된 주소를 클릭하면 브라우저에서 새로 열리게 되는데요. 만약, 유효성 검사 중이라면 『검사가 끝난 후 눌러주세요』라는 메시지박스가 뜹니다.


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
private void lbox_removed_url_Click(object sender, EventArgs e)
{
    if (lbox_removed_url.Items.Count == 0)
    {
        return;
    }
 
    if (backgroundWorker1.IsBusy == true)
        MessageBox.Show("검사가 끝난 후 눌러주세요");
    else
        System.Diagnostics.Process.Start(lbox_removed_url.SelectedItem.ToString());
}
 
private void lbox_used_url_Click(object sender, EventArgs e)
{
    if (lbox_used_url.Items.Count == 0)
    {
        return;
    }
 
    if (backgroundWorker1.IsBusy == true)
        MessageBox.Show("검사가 끝난 후 눌러주세요");
    else
        System.Diagnostics.Process.Start(lbox_used_url.SelectedItem.ToString());
}
cs


BackgroudWorker 동작이 끝나면 리스트 박스에 추가된 URL이 브라우저에서 열립니다.


c# 웹페이지 존재 확인[C# http 통신으로 URL 호출]

3. 웹페이지 존재 확인 - BackgroudWorker DoWork 이벤트


핵심은 HttpWebRequest, HttpWebResponse입니다. Request 메소드를 HEAD로 설정하면 웹페이지가 유효했을 때 반환 값이 들어오지만 그렇지 않을 경우 오류가 발생합니다.


이 부분을 try catch로 묶어 간단하게 블로그 주소 URL이 유효한지 검사할 수 있어요.


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
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    idx_start = Convert.ToInt32(tb_idx_start.Text.ToString());
    idx_end = Convert.ToInt32(tb_idx_end.Text.ToString());
 
    HttpWebRequest request = null;
    HttpWebResponse response = null;
 
    int start_idx = Convert.ToInt32(tb_idx_start.Text.ToString());
 
    for (int idx_start = start_idx; idx_start <= idx_end; idx_start++)
    {
        url = $"{tb_blog_url.Text.ToString()}{idx_start.ToString()}";
 
        try
        {
            request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "HEAD";
 
            response = request.GetResponse() as HttpWebResponse;
 
            lbox_used_url.Invoke(new MethodInvoker(delegate
            {
                lbox_used_url.Items.Add(url);
            }));
        }
        catch
        {
            lbox_removed_url.Invoke(new MethodInvoker(delegate
            {
                lbox_removed_url.Items.Add(url);
            }));
 
            Console.WriteLine(url);
        }
        
        request.Abort();
        
    }
 
    response.Close();
    response.Dispose();
    request.Abort();
}
cs



 17번 라인 

 HttpWebRequest 객체를 만들고 url 주소를 입력합니다.

 18번 라인

 Method는 요청에 대한 메서도를 가져오거나 설정합니다. 인터넷 리소스에 접속하는 데 사용할 요청 메서드로 기본값은 GET입니다. 유효하지 않은 URL이 사용되면 아래와 같은 에러 메시지가 출력됩니다.


원격 서버에서 (404) 찾을 수 없음 오류를 반환했습니다.


37번 라인처럼 HttpWebRequest의 Abort 함수를 호출해 설정을 처음으로 돌립니다.


c# 삭제 존재 url 티스토리[C# http 통신으로 URL 호출]


4. 백그라운드워커 Completed 이벤트


DoWork 함수가 종료되면 RunWorkerCompleted 이벤트가 동작합니다. 삭제 유효성 검사가 끝나면 말이죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        MessageBox.Show("시스템 에러 유형 1");
    }
    else if (e.Error != null)
    {
        MessageBox.Show("시스템 에러 유형 2");
    }
    else
    {
        backgroundWorker1.CancelAsync();
 
        GC.Collect();
 
        MessageBox.Show("검사 완료");
    }
}
cs


큰 건 없고, 13번 라인처럼 RunWorkerAsync로 백그라운드워커가 실행되었으니 CancelAsync로 종료합니다.




코드 수정이나 추가 기능 구현이 필요하다면 알려주세요. 제가 최대한 도와드리도록 하겠습니다.


C#으로 티스토리에 지워진 포스팅 주소 (웹페이지) 찾기

written by vicddory